引用
别名,声明时必须初始化,目的是通过引用修改变量值
左值
可以出现在等号左边,能够取地址,有名字,举例:
变量名
int a = 10;//a就是左值
返回值是左值引用的函数调用
int & ...( )
前置自增自减
++i(对i+1,赋值给i,返回值就是i)
--i(同上)
赋值运算或复合赋值运算
(i=9)=100;//100
(i+=10)=1000;//1000
解引用
A *a = new A();
*a = ...;you
右值
只能在等号左边不能取地址,没有名字,举例:
字面值
int a = 8;//8就是右值
返回非引用类型的函数调用
后置自增/自减
i-- = 100(int j = i;i = i-1;return j;)//先拷贝i,然后i+1并赋值给i,返回的是副本
i++ =100; (同上)
算术表达式+、-
a+b
逻辑表达式&、!= 等
a&&b
比较表达式
a == b、a>=b
将亡值
C++11引入的右值引用(移动语义)相关的值类型
将亡值用来触发移动构造或移动赋值构造,并进行堆上资源转移,之后调用析构函数
通过std::move,static_cast<T&&>(x),将左值转化为将亡值(将左值转换为右值,使拷贝变为移动)
左值引用与右值引用的区别
左值引用是对左值的引用;右值引用是对右值的引用
const左值引用能指向左值,局限是不能修改
右值引用通过std::move()可以指向左值
声明出来的左值引用或右值引用都是左值
T&&a=b;//a是右值的引用,具名,a是左值
T&a = b;//a是左值的引用,具名,a是左值
功能差异
左值引用:避免对象的拷贝(传参、函数返回值)
右值引用:实现移动语义、完美转发
移动语义
通过实现移动语义,对象赋值时,避免资源的重新分配,移动构造和移动赋值构造