2. 左右值
2.1 概念
左值指既能够出现在等号左边,也能出现在等号右边的变量;右值则是只能出现在等号右边的变量。
int a; // a为左值
a = 3; // 3为右值
- 左值是可寻址(有地址)的变量,具有永久性,数据绑定;
- 右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时变量,短暂性,让临时变量不消失,直接将目标指向临时变量,避免无意义的复制,减缓内存开销。
左值用于写操作,可以存储数据;
右值用于读操作,读到的数据放在一个看不见的临时变量
区别:左值可以被修改,而右值不能。
2.2 左值引用和右值引用
-
左值引用:引用一个对象;
-
右值引用:C++中右值引用可以实现“移动语义”,通过
&&
获得右值引用int x = 6; // x是左值,6是右值 int &y = x; // 左值引用,y引用x int &z1 = x * 6; // 错误,x*6是一个右值 const int &z2 = x * 6; // 正确,可以将一个const引用绑定到一个右值 int &&z3 = x * 6; // 正确,右值引用 int &&z4 = x; // 错误,x是一个左值
2.3 左右值引用示例
引用的注意事项:①引用必须初始化;②引用初始化后不可以改变
int main() {
int a = 10;
int b = 20;
//int &c; //错误,引用必须初始化
int &c = a; //一旦初始化后,就不可以更改
c = b; //这是赋值操作,不是更改引用
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
return 0;
}
上述代码中
int &c = a;
就是左值引用(赋地址操作),c的地址绑定了a,c和a会一起一起改变
c = b;
是右值引用(赋值操作),c得到了b地址中存储的值,同时a也跟着改变
因此输出为
a = 20
b = 20
c = 20