@skyway
2015-10-18T08:03:55.000000Z
字数 1852
阅读 864
C++
大部文章分都有提及到以下几点
但是还有些我觉得需要更深入的去理解的问题,引用怎么实现的??
其实是没有const引用(引用本来就不允许修改),有const指针;但是
double tmp = 1.0;
double& const rd = tmp;
编译可通过,也可以正常输出,只是const被忽略了。但是
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,肯定指向一个double值
}
是正常的,这是为了避免参数在函数内被修改(const只能修饰输入参数)。
引用作为成员时,其占用空间与指针相同。
class B{
char b;
char &c;
};
class C{
char b;
char *c;
};
void main(){
cout<<sizeof(B)<<endl; // 8
cout<<sizeof(C)<<endl; // 8
}
v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值
*v[5] = 10; // 如果操作符[]返回一个指针
int i=2;
int& ref = i;
int *p = &i;
第二三行的汇编实现:
8048727: 8d 44 24 1c lea 0x1c(%esp),%eax
// esp寄存器里的变量i的地址传给eax
804872b: 89 44 24 18 mov %eax,0x18(%esp)
//将寄存器eax中的内容(i的地址)传给寄存器中的变量ref,即int& ref=i
8048777: 8d 44 24 1c lea 0x1c(%esp),%eax
// esp寄存器里的变量i的地址传给eax
804877b: 89 44 24 10 mov %eax,0x10(%esp)
//将寄存器eax中的内容(即i的地址)传到寄存器esp中的p
两者实现方式相同,同时也说明了引用是需要占用空间的。
如果对象存在为空的可能性就不可使用引用,否则奔溃或输出是不确定的。
void printDouble(const double& rd)
{
cout << rd; // 不需要测试rd,肯定指向一个double值
}
//相反,指针则应该总是被测试,防止其为空:
void printDouble(const double *pd)
{
if (pd) { // 检查是否为NULL
cout << *pd;
}
}
参考
http://blog.xieyc.com/const-in-detail/
http://www.cnblogs.com/fancyboy2004/archive/2008/12/23/1360810.html
http://blog.csdn.net/dujiangyan101/article/details/2844138
http://blog.jobbole.com/86863/
http://www.cnblogs.com/hoodlum1980/archive/2012/06/19/2554270.html