c++里给常量引用初始化赋值的类型不一致的时候,编译器会创建临时量,这个时候常量引用其实是引用的临时量,这个临时量我们是没法访问的。如果改变了被引用的变量的值,通过引用来输出的话还是输出原来的值(即临时量的值)。
如果给常量引用初始化赋值的类型是一致的,那么编译的时候就不会生成临时量,这个时候不管怎么改变被引用的变量的值,通过引用输出的值都是被引用的值,而不是临时量。
举例如下:
c++中常量引用:const int &p=someval;
当等号后面跟的是一个非int类型的基本类变量,编译器会创建临时量。比如:
float someval=3.14159;
const int &p=someval;
这个时候,编译器会如下操作给p赋值:
const int tmp=3;
const int &p=tmp;
这个时候如果改变了someval的值,在通过p输出的时候不会是someval的值。
someval=55.5555;
cout<<p<<endl; //输出还是为3
完整测试程序:
int main(int argc,char** argv){
float someval=3.1415926;
const int &p=someval; // 在这里我用float类型赋值给整型的引用,触发临时变量产生,p是临时量。跟someval不在同一内存单元
cout<<someval<<","<<p<<endl; // 输出:3.1415926,3
someval=5555.5555;
cout<<someval<<","<<p<<endl; //输出:5555.5555,3
//下面测试类型一样的情况
int goodval=1000;
const int & pg=goodval; //在这里两边赋值的类型是一致的,不会触发产生临时量,pg就是goodval,内存里是同一个内存单元。
cout<<goodval<<","<<pg<<endl; //输出1000,1000
goodval=999; //这里改变goodval值,后面输出还是会一致
cout<<goodval<<","<<pg<<endl; //输出 999,999
return 0;
}