一. 入门:概念引入
1. 变量与引用的关系
定义一个普通 int 类型变量 val ,初始值假设为 10。
1 int val = 10;
再定义一个该变量的引用 val_ref
1 int &val_ref = val;
引用就是该变量的一个别名,对引用做出的改变,均会体现在原来的变量上。引用可以提高效率,比如避免不必要的复制。但是它也有坏处:可以改变原来的变量内容(有时候你不希望这么做)。
2. const 与变量的关系
上面的变量 val 是可以被改变的,如果希望它不被改变,则需要这么做:
1 const int val = 10;
加上 const 以后,变量 val 成了一个常量,它不允许被改变。在程序运行时,一切改变常量 val 内容的行为,都会被编译器指出。
二. 进阶: const 与引用的关系
我们现在把变量跟它的引用看成一个整体,一一对应。一个变量没有 const ,那么它是一个普通变量,可以被改变;加上 const 以后,它成为了一个常量,不允许被改变。引用也是一样。
这样就产生了如下 4 种情况:
1.
1 int a = 10; 2 int &a_ref = a;
变量 a 可以被改变,它的引用 a_ref 也可以用于修改变量 a 。这时,对引用的改变会体现在原变量上。
2.
1 const int b = 20; 2 const int &b_ref = b;
常量 b 不能被改变,同时它的引用也不能被用于修改原变量。
3.
1 int c = 30; 2 const int &c_ref = c;
变量 c 可以被改变,但它的引用不能被用于修改原变量。这句话的意思是,允许你修改变量 c 的值,但并不是通过它的引用来修改,你需要选择另外一种途径。
4.
1 const int d = 40; 2 int &d_ref = d;
这种写法是错误的。常量 d 是一个不能被修改的值,但是它的引用却是一个普通 int 类型,这两种类型并不匹配,所以编译器会报错。