小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/
目录
前一篇教程所说的引用,全名叫做左值引用。以下将讲解左值和右值,还有左值引用和右值引用。至于为什么要用引用,将在下一篇教程讲解。
左值和右值
区分左值和右值的简单方法:
int a = 0; // 0是值, 值没有名字所以是右值; a是变量名, 因为是名字所以是左值
int b = std::abs(1024); // 函数的返回值, 没有名字所以是右值; b是变量名所以是左值
int c = a; // a是右值, c是变量名所以也是左值
也就是说,区分左值和右值的简单方法就是这个东西有没有名字。
左值引用和右值引用
左值引用就是左值的引用,即上一篇教程所说的内容,由于历史原因一般简称引用:
int a = 0; // a是左值
int &b = a; // b是左值a的引用, b保存的内容发生改变时, a保存的内容也会随之改变
右值引用就是右值的引用,使用数据类型 &&
来声明:
int &&a = 0; // 0是右值, 可以用右值引用来保存
int &&b = std::abs(1024); // 返回值是右值, 可以用右值引用来保存
// a虽然是右值的引用, 但是a已经是名字了, 也就是左值
// 所以要用左值引用而不能使用右值引用
int &c = a;
因为右值引用是右值的别名,所以声明的时候也需要初始化。
然而,int &&a = 0;
和int a = 0;
一样,int &&b = std::abs(1024);
和int b = std::abs(1024);
一样,所以聪明的你会发现,右值引用就是只能接收右值的普通变量。
右值引用并不是这样使用的,右值引用的用途,基本上都用在函数参数上,并且与左值引用进行区分,用来优化程序。
使用const
const
作用在左值引用:
int a = 0;
const int &b = a; // b是a的别名, 但是不能通过b来改变a的值
a = 1024; // b的值随之改变
// b = 6666; // 去掉开头注释将会报错, 因为受到const的限制, b是只读的
const
作用在右值引用:
const int &&a = 0; // 实际上就是 const int a = 0;
补充知识(了解即可)
C++为了对右值进行优化,从C++11开始引入左值和右值的概念,此前并没有这样的概念,C++11前左值引用只叫做引用。