一、左值与右值
左值:能出现在赋值运算符左边或者右边的表达式
右值:只能出现在赋值运算符右边的表达式
二、const引用
示例一:
#include <iostream>
using namespace std;
int main()
{
const int val=3;
int &ri=val;
cout << ri << endl;
return 0;
}
以上这段代码是错误的。
解释:因为val是const的常量,而紧接着声明了一个非常量的引用ri,引用可以理解为别名,那么ri不是常量,也就是说如果修改ri的值,那么val的值也会被修改,而val是常量,修改是不被允许的。
示例二:
#include <iostream>
using namespace std;
int main()
{
int val=3;
const int &ri=val;
val=4;
cout << ri << endl
<< val << endl;
return 0;
}
程序运行结果:
4
4
解释:val是变量,初值为3,而ri是val的引用,该实例中,修改ri的值是不可以的,也就是说不能写诸如“ri=4”这样的表达式。
而val=4,也就修改了val的值,自然修改了ri的值。
示例三:
#include <iostream>
using namespace std;
int main()
{
double val=3.0;
const int &ri=val;
val=4;
cout << ri << endl
<< val << endl;
return 0;
}
程序运行结果:
3
4
解释:这个程序与示例二唯一不同的地方就是在于第六行声明的val是double类型,而const引用是int类型。
那么编译器在这时候就会自动将程序等价的修改为:
#include <iostream>
using namespace std;
int main()
{
double val=3.0;
int temp;
temp=val;
const int &ri=temp;
val=4;
cout << ri << endl
<< val << endl;
return 0;
}
由此看来,首先程序将temp初始化为val的值,然后声明一个const引用ri,此时,修改val的值,不会改变temp的值,也就不会改变ri的值了。
因此,程序执行结果是3和4.
另外,const引用还可以将引用初始化为右值,也就是说可以这样写:
const int &ri=11;
而非const引用则不可以将引用初始化为右值,也就是说如果这样写:
int &ri=11;
则是非法的。