1. 引用:
引用可以理解为变量的别名。(此处提到的变量既包括定义的局部变量,全局变量等,也包括程序中用到的临时变量,中间变量)
提到引用就需要提到左值和右值的概率,这也是对变量的分类。
左值和右值:
故名思意,可以放在等号左边的变量叫做左值,书中的定义是可以获取其地址的一个量,个人认为这种定义不合适(常量可以取地址)。确切的说应该是可以放在等号左边被赋值的一个带有名称的量或者对象。书中给出右值的定义是除了左值之外所有的量,更确切的理解是,文本常量,临时值,临时对象,匿名对象。
理解了左值和右值,又引入,左值引用和右值引用。
左值引用就是对左值取引用,符号&,左值引用可以理解为左值的别名,其与指针不同不需要分配内存,对引用的修改即是对变量的修改。
指针的“*”操作称为解引用,指针解引用和引用的区别就是指针和引用的区别。两者有本质的不同。指针解引用的过程也是指针取得变量引用的过程,因此这个操作也可以叫做取内容。
右值引用就是对右值取引用,符号&&,其原理是接管右值的内存地址,避免因右值(临时对象,临时变量,匿名对象)的释放,究其深层原因是防止因参数赋值造成的额外开销和资源浪费(内存,CPU),同样也可以避免类类型的浅出拷贝。
2. 移动语态:
移动语态是基于右值引用产生的概念。移动语态和右值引用的思路基本吻合,防止因拷贝产生的额外开销和程序错误。对于某些对象的复制,如果没有编写单独的拷贝构造函数或重载赋值操作符,可能无法深拷贝(deep copy),浅拷贝(shallow copy)会造成程序运行错误。所以需要编写移动构造函数或者重载移动赋值运算符,此二者的性能要优于拷贝构造函数和重载赋值操作。C++中的移动操作语句std::move();
由于右值引用是C++ 11标准支持,因此右值引用和移动语义都是C++ 11的内容。