复合类型之引用
来源:互联网 发布:淘宝信息发布平台 编辑:程序博客网 时间:2024/05/16 03:22
引用包括“左值引用”和“右值引用”两种;
左值引用
引用为对象起了另一个名字,通过将声明符写成&d的形式来定义引用类型。
int i = 1024;int &refval = i; //refval 是i的别名
一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序会把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用和它的初始值绑定在一起,因为无法把引用重新和另外一个对象进行绑定,因此引用必须初始化。
引用即别名
引用就是一个对象的别名,定义一个引用之后,无论是获取值还是修改值,都要对引用所绑定的对象进行操作。
int i = 1024;int &refval = i; printf("%d\n", refval);//refval=1024 i=1024 refval = 4; //修改refval即是修改iprintf("%d\n", refval); //refval=4 printf("%d\n", i); //i=4
引用的定义
允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头。所有引用的类型都要和与之绑定的对象严格匹配。而且,引用只能绑定在对象上,而不能和字面值或某个表达式的计算结果绑定在一起。
int &refVal4 = 10; //错误 引用和字面值不能绑定在一起double dval = 3.14;int &refVal5 = dval;//错误 引用类型和绑定对象那个必须严格匹配
特殊情况
const的引用
const 知识参考:http://blog.csdn.net/u013266600/article/details/78302238
引用都是对一个对象进行引用,那么如果这个对象时const 类型呢?当然也是可以定义相关的引用的。
const int i=3; //常量对象const int &r1=i; //引用合法int &r2=i; //错误,如果合法,可以令r2类修改i,但是i作为常量,不能被当做左值来修改
在初始化常量引用时允许用任意表达式作为初始值,只要改表达式能转化成引用的类型即可。尤其是,允许一个常量引用绑定非常量的对象,字面值,甚至是一个表达式。
int i=42;const int &r1=i; //一个常量引用绑定非常量的对象const int &r2=42; //一个常量引用绑定字面值const int &r3=r1*2; //一个常量引用绑定表达式int &r4=r1*2; //r4是一个普通的非常量引用,两者类型不一致
当定义一个常量引用时,编译器会做一些有意思的工作。
double dval=3.14;const int &i=dval;
如果是普通引用,则因为定义引用的类型和对象类型不一致,肯定出错;
但是如果是常量引用,则编译器会定义临时变量,来存储dval 的值,定义的这个临时变量和定义的引用类型是一致的。即如下:
const int temp=dval;const int &i=temp;
同时,还有一点,因为可以针对一个非常量对象定义一个常量引用,所以可以通过其他途径来修改这个非常量对象的值,只是不能通过我们所定义的这个常量引用来修改。
int i=42;int &ival=i;const int &ci=i; //一个常量引用绑定非常量的对象ival=10; //普通引用修改值ci=20; //错误 常量引用
右值引用
C++11中新增的特性,这种引用主要用于内置类,后续学习补充~
总结:
(1)引用即别名,与定义的对象进行绑定。
(2)引用必须初始化;引用不能与字面值进行绑定;引用必须和绑定的对象进行严格匹配。
(3)如果该引用定义为const引用,则允许一个常量引用绑定非常量的对象,字面值,甚至是一个表达式。对一个常量对象则必须定义为常量引用。
- 复合类型之引用
- c++ 中复合类型之-引用
- 复合类型(一):引用
- 复合类型之一 引用
- 复合类型 —— 引用
- C++之复合类型
- Hive之复合类型
- C++之复合类型
- 复合类型之指针
- C++ primer:引用是复合类型?
- 复合类型——引用、指针
- 复合类型——指针和引用
- 《c++primer笔记》复合类型--引用
- C++ 复合类型-指向指针的引用
- 指针和引用、复合类型的声明
- C++复合类型--引用和指针
- C++复合类型:指针和引用
- 2.3复合类型(引用和指针)
- ionic购物车框架模板
- DOS查看端口占用情况并杀死占用某个端口的进程
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) E. National Property
- 36. LatencyTOP
- iphoneX布局适配及iOS 11.0系统适配
- 复合类型之引用
- sql一张表中两个字段指向同一个外键
- 实现一个函数判断year是不是闰年。
- 素数表
- Strust2实现文件上传
- golang并发ssh执行远程命令
- 创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。
- 进程间通信—共享内存、信号量
- 升级.Net Core 1.x App 及.Net Standard 1.x Library 到2.0 版