新手入门:C++下的引用类型

  引用类型也称别名,它是个很有趣的东西。在c++ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作对象,引用类型主要是用在函数的形式参数上,通常我们使用它是把类对象传递给一个函数。 引用对象采用类型名加上&符号和名称的方式进行定义。例如:(int &test;),这里我们就定义了一个int类型的名为test 的引用,但是int &test;这样的方式是不能够被编译成功的,因为引用的定义必须同时给应用进行赋值操作,这里的赋值并不是说把变量的值传递给引用,而是把引用指向变量,写成这样就对了:(int &test=变量名;)。

#include <iostream> 
using namespace std; 
 

void main(void) 

 
int a=10; 

int &test=a; 
test=test+2; 
 
cout << &a << "|" << &test << "|" << a << "|" <<test << endl; 

 
cin.get(); 
}

  观察并编译运行上面的代码你会发现&a和&test的地址显示是相同的,a和test的值显示也是一样的!

  结合前一个教程的内容我们来说一下const引用的相关内容,这里要特别注意,和前一个教程一样带const修饰的引用同样也容易混淆概念!

  const修饰如果用在引用上会有一个特别之处,它的奥妙就在于可以进行不同类型的对象的初始化,而这一切在普通变量操作上是不可能的下面我们来看一个例子:

#include <iostream> 
using namespace std; 
 
void main(void) 

 
int a=10; 

//double &test = a + 1.2f; //这句就是错误的! 
const double &test = a + 1.2f; 
 
cout << &a << "|" << &test << "|" << a << "|" <<test << endl; 

 
cin.get(); 
}

  上面的代码足够说明问题了,这就是const修饰带来的好处,但是聪明的人会在输出的时候发现一个问题,就是a和test的值的输出不同,按照最先说的道理应该可以改变a的值呀,为什么在这里却有没有能够改变呢?

  道理是这样的,const修饰过后的引用在编译器内部是这样进行变化的。

int a=10; 
const double &test = a + 1.2f;

  这样的一段代码在编译器认为却是下面的方式进行的

int a=10; 
int temp = a; 
const double &test = temp + 12.f

  这里其实是把a的值赋给了一个临时temp 变量,而后test获得的却是temp+12.f
改变的是temp而不是a,所以就出现了a和test显示的值不同的情况,这里要特别注意,这是一个很容易混淆的地方,在编写程序的时候要特别仔细,以免出现了问题却检查不出为什么!

 
 

《挑战30天C++入门极限》新手入门:C++下的引用类型的更多相关文章

  1. 《挑战30天C++入门极限》入门教程:实例详解C++友元

        入门教程:实例详解C++友元 在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点: 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为pu ...

  2. 《挑战30天C++入门极限》入门教程:C++中的const限定修饰符

        入门教程:C++中的const限定修饰符 const修饰符可以把对象转变成常数对象,什么意思呢? 意思就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用! ...

  3. 《挑战30天C++入门极限》新手入门:C/C++中的结构体

        新手入门:C/C++中的结构体 什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构 ...

  4. 《挑战30天C++入门极限》新手入门:C++中堆内存(heap)的概念和操作方法

        新手入门:C++中堆内存(heap)的概念和操作方法 堆内存是什么呢? 我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作 ...

  5. 《挑战30天C++入门极限》新手入门:C++中的函数重载

        新手入门:C++中的函数重载 函数重载是用来iostream>  using namespace std;  int test(int a,int b);  float test(flo ...

  6. 《挑战30天C++入门极限》新手入门:关于C++中的内联函数(inline)

        新手入门:关于C++中的内联函数(inline) 在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数. 可能说到这里,很 ...

  7. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  8. 《挑战30天C++入门极限》新手入门:C++中布尔类型

        新手入门:C++中布尔类型 布尔类型对象可以被赋予文字值true或者false,所对应的关系就是真与假的概念. 我们通常使用的方法是利用他来判断条件的真与假,例如下面的代码: #include ...

  9. 《挑战30天C++入门极限》新手入门:C/C++中数组和指针类型的关系

        新手入门:C/C++中数组和指针类型的关系 对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关系的了解可以更加深入的掌握数组和指 ...

随机推荐

  1. webpack4打包报错ERROR in multi ./src/main.js dist/bundle.js

    webpack打包测试: 上边将mode01.js模块及main.js主文件编写完成,下边使用webpack对这些js文件进行打包 1.进入程序目录,执行webpack main.js build.j ...

  2. SpringBoot与整合其他技术

    SpringBoot与整合其他技术 5.1 SpringBoot整合Mybatis 5.1.1 添加Mybatis的起步依赖 <!--mybatis起步依赖--> <dependen ...

  3. azkban从编译开始安装

    从git上下载最新的azkban稳定版代码 git clone https://github.com/azkaban/azkaban.git -b 3.74.3 这里还有个问题,如何把这个代码放到自己 ...

  4. Xcodeproj相关以及删除 多层文件夹、库、资源逻辑

    一.介绍Xcodeproj是CocoaPods用ruby开发的一个插件库,可以用来新建.修改Xcode工程. 二.wiki和资源Xcodeproj wiki   :https://www.rubydo ...

  5. vue2.0项目在360兼容模式下打开空白

    安装两个依赖环境 yarn add babel-polyfill -D yarn add babel-preset-es2015 babel-cli -D 在main.js中引入babel-polyf ...

  6. React Native 开发豆瓣评分(二)路由配置

    路由管理使用官方推荐的 React Navigation; 配置环境 安装相关依赖 yarn add react-navigation react-native-gesture-handler Lin ...

  7. 如何恢复SVN被删除文件、文件夹

    转自:https://blog.csdn.net/chuangxin/article/details/81226657 一.摘要本文讲述在客户端(如:Tortoise SVN,开发工具IDE SVN插 ...

  8. apk反编译工具包for Mac OS的使用

    在本文中我将介绍如何在Mac OS X上使用apktool.jar.dex2jar.jd-gui来进行apk的反编译和查看源码.下面会提供每个工具的下载地址. 测试环境:OS X EI Capitan ...

  9. keekalived+nginx 高可用

    高可用环境准备 后端服务器主配置文件 [192.168.2.7-root@web01~]#cat /etc/nginx/nginx.conf user www; worker_processes 1; ...

  10. HTML&CSS基础-外边框

    HTML&CSS基础-外边框  作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML <!DOCTYPE html> <html> <h ...