1、引用:
1.引用必须初始化,指针可以不初始化,但是这样很危险,因为它会变成一个未定义变量,没初始化便去使用的话,dangerous!!
2.引用只能指向初始化的对象,而指针的话可以改变指向。(说白了引用就是指针常量!)
3.引用类型必须是一个对象,而且类型必须保持相同
double a=3.14;
int &r1=a;//错误
double &r2=a;//正确
2、const
1.const修饰的值,不能去改变,其实也就是自己约法三章,不能通过该值改变
const int a=10;
a=20;//错误
int a=20;
const int b=a;
a=30;//这种操作又是可以的,可怜了绿帽b
2.const的例外情况:
1. 将const引用绑定到非常量的对象,字面值,甚至是一个一般表达式
int a=10;
const int &r1=a;
const int &r2=10;
const int &r3=r1*2;
int &r4=r1;//错误
上述1、2、3例子,其中发生的情况是:(其实也只在数据类型不一样的时候才有temp,都是int依旧没戏)
double a=3.14;
const int&r1=a;//这种情况是可行的
//以下是编译器做出的处理
const int temp=a;//编译器创建了一个临时的const int temp
const int & r1=temp;//也就是用了一个临时的temp变量
如下图 第二次输出仍然是3,而不是赋值后的20,说明确实只改变了上述的temp临时变量
注意!!!!如果说是int a 然后const 引用指向它 改变a的值的话 并不会额外创建一个temp!!
r1自己给自己约法三章,不允许自己去修改
如果说const绑定的是一个非const的引用,只要它指向的对象类型相同,那还是不会创建一个新的temp变量,只有类型不同的时候才会创建一个temp值,如下图r1改变了,a改变了,r2仍然没有改变
只有引用类型不匹配的时候,编译器才会做临时变量处理。
网友评论