int& 就是声明一个int的引用类型。
int value;
int& ref = value;
这样就顺利通过编译。如果引用没初始化则编译器拒绝编译过去,知道你引用的是实际存在的变量。
有人会写下这样的代码 int& ref = 1;这时候编译器拒绝了他,因为编译器找不到常量1的地址,于是这时候可以得到一个结论引用的变量必须有一个实际的地址。
在const & 的时候就有差别了
先说一下相似的
int value;
const int & ref = value;
ref = 1;//编译器毫不留情的拒绝此语法。因为ref是const的,不能改写。
但对ref取值的时候则就是value的值。value变ref也跟着变,但不得对ref进行赋值。
接下来就是最大区别的地方了
const int& ref = 1;
编译器接受了这样的语法。这有问题么?没问题,这是一个特别的规定
会这样处理
int no_name_value = 1;
const int& ref = no_name_value;
这跟上面的代码类型,但区别在于no_name_value这个变量你是不能使用的,根本看不到有这个变量的存在。
但确实编译器会这样处理,增加了一个没有任何名字的变量,然后让这个const& 去引用他。
记住最重要的一点,no_name_value和ref的生存周期是同步的。两个存在同时销毁。
我们用一个简单的例子演示一下。
- #include<stdio.h>
- class test
- {
- int Value;
- public:
- test(int val):Value(val)
- {
- printf("构造函数Value=%d/n",Value);
- };
- ~test()
- {
- printf("析构函数Value=%d/n",Value);
- }
- void print()const
- {
- printf("print/tValue=%d/n",Value);
- }
- };
- int main()
- {
- printf("begin/n");
- const test& obj = 2;//也可以写成 const test& obj = test(2);
- obj.print();
- printf("end/n");
- return 0;
- }
结果如下
begin
构造函数Value=2
print Value=2
end
析构函数Value=2
是不是const&很特别的呢;