目录
Reference(引用)特点
-
Reference一般不用在变量的声明上,通常在参数传递时使用Reference(Pass by reference or Return by reference),原因:传入传出时速度更快~
-
本质是pointer(指针),引用的内部实现是通过指针实现的,编译器将其伪装成值,因此引用(Reference)可称为代表一个值
从内存分析
double x = 0;
double* p = &x;
double& r = x;
cout << sizeof(x) << endl;//8字节
cout << sizeof(p) << endl;//4字节
cout << sizeof(r) << endl;//8字节 sizeof(r)==sizeof(x)
cout << *p << endl;//0
cout << x << endl; //0
cout << r << endl; //0
cout << p << endl; //007BFAA8
cout << &x << endl;//007BFAA8
cout << &r << endl;//007BFAA8
可以很清楚的看出指针占4个字节,而值和引用都占8个字节,因此引用与值的大小相同,地址相同,值多大,引用就是多大,这是编译器造成的假象,其实引用就是一个指针,是一种更漂亮的指针
为什么喜欢用Referencce
1.因为其本质是指针,所以传入传出时速度快,占用空间小
2.传入传出引用与传入传出值时格式高度一致
//被调用端
void func1(Cls* pobj) {pobj->xxx();}//指针传参
void func2(Cls obj){obj.xxx();}//普通传参
void func3(Cls& obj){obj.xxx();}//与普通传参数写法相同
Cls obj;
//调用端
func1(&obj);//指针调用端
func2(obj);//普通调用
func3(obj);//与普通调用端相同
const reference&non—const reference(常量引用与非常量引用的比较)
测试代码如下
//常量引用
double d = 3.14;
const int &r1 = d;
//非常量引用
int &r2 = d;
为了确保r1、r1能够绑定一个整数,编译器会将代码转换成如下
//常量引用
const int temp = d;
const int &r1 = temp;//编译通过
//非常量引用
int temp = d;
int &r1 = temp;//编译失败,r1未能实现绑定d的效果(实际绑定的是temp)
代码运行图示
总结
常量引用
只要绑定的对象能够成功转换成引用的类型即可,非常量引用
则必须绑定类型一致的对象
注意事项
//以下被视为same signature(相同签名)
double imag(const double& im){....}
double imag(const double im){....} //Ambiguity
-
这种情况时函数是不可以重载的,因为参数列表在编译器看来是同一个东西
-
但是这种情况下可以重载
该函数的const函数
,因为编译器视const为不同签名