刚开始学习C++, 看到了C++的引用,有些地方不太理解,经过了些许思考,现做如下总结:
const引用只是给普通变量起一个别名而已:
1. 将非const变量赋值给非const引用:
void test2()
{
int i = 1;
int &j = i;
printf("%d\n", j);
i = 10;
printf("%d\n", j);
}
执行结果: 1
10
在这里i,j只不过是对同一段内存空间的不同标记而已。
2. 将非const变量赋值给const引用:
void test2()
{
int i = 1;
const int &j = i;
printf("%d\n", j);
i = 10;
printf("%d\n", j);
}
执行结果: 1
10
在这里i,j同样是对同一段内存空间的不同标记,但是因为j是const引用,所以不能改变j的指向。但由于j始终和i指向同一段内存,当i改变时j也会随之改变。
void test3()
{
const int i = 1;
int &j = i;
}
很遗憾,不能这样做,不能将一个const变量赋值给非const引用。
4. 将const变量赋值给const引用:
void test4()
{
const int i = 1;
const int &j = i;
}
在这种情况下由于i,j都是const的所以不能被修改。
5. 将常量赋值给非const引用:
void test5()
{
int &i = 1;
}
很遗憾,不能这样做,不能将一个常量赋值给非const引用!
6. 将常量赋值给const引用:
void test6()
{
const int &i = 1;
}
可以将一个常量赋值给const引用!
7. 将不同类型的值赋值给const引用:
void test5()
{
double i = 3.14;
const int &j = i;
printf("%p\n", j);
i = 20.2;
printf("%p\n", j);
}
执行结果: 3
3
为什么不是20呢?这是由于将一个double类型的值转换为int类型时编译器相当于做了一次中转:
double i = 3.14;
int tmp = double ; // tmp = 3
const int &j = tmp;
此时j,tmp指向同一段内存空间,由于我们无法修改tmp,所以j将不会被修改。