引用
左值引用:引用并非对象,相反的,它只是为一个已经存在的对象所起的另一个名字。
在定义引用时,程序把引用和它的初始值绑定在一起,而不是拷贝,节省了内存资源;引用必须被初始化,引用类型的初始值必须是一个对象,不是确切的数据;
C++ 引用 vs 指针:
引用很容易与指针混淆,它们之间有三个主要的不同:
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
作为函数参数传递时:
值传递:被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本,开辟额外的内存空间,不会改变形参的数据。
指针传递:实际上也是值传递,只是传递的是地址,开辟额外的内存空间,形参的数据会改变。
引用传递:形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
最后,总结一下指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
最后,总结一下指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
- ●指针是一个实体,而引用仅是个别名;
- ●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
- ●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
- ●引用不能为空,指针可以为空;
- ●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
- ●指针和引用的自增(++)运算意义不一样;
int main() ( int ar[5] = { 1,2,3,4,5 }; int* ip = ar; //数组首元素地址 int& b = ar[O]; //数组首元素的别名叫b ++ip; //由0下标的地址指向1下标的地址 ++b; //由0下标指向1下标 }
- ●引用是类型安全的,而指针不是 (引用比指针多了类型检查)
右值引用:一般来说,不能取地址的表达式,就是右值引用,能取地址的,就是左值。
转移语义: move 本意为 "移动",但该函数并不能移动任何数据,它的功能很简单,就是将某个左值强制转化为右值。基于 move() 函数特殊的功能,其常用于实现移动语义。