[关闭]
@skyway 2015-10-18T08:03:55.000000Z 字数 1852 阅读 864

【整理】指针和引用初探

C++


大部文章分都有提及到以下几点

相同点

不同点

其他疑惑

但是还有些我觉得需要更深入的去理解的问题,引用怎么实现的??

引用没有 const,指针有 const

其实是没有const引用(引用本来就不允许修改),有const指针;但是

  1. double tmp = 1.0;
  2. double& const rd = tmp;

编译可通过,也可以正常输出,只是const被忽略了。但是

  1. void printDouble(const double& rd)
  2. {
  3. cout << rd; // 不需要测试rd,肯定指向一个double值
  4. }

是正常的,这是为了避免参数在函数内被修改(const只能修饰输入参数)。

引用成员占用空间

引用作为成员时,其占用空间与指针相同。

  1. class B{
  2. char b;
  3. char &c;
  4. };
  5. class C{
  6. char b;
  7. char *c;
  8. };
  9. void main(){
  10. cout<<sizeof(B)<<endl; // 8
  11. cout<<sizeof(C)<<endl; // 8
  12. }

指针传递和引用传递

使用场合

  1. 如果需要指向一个对象,可修改指向另一个对象,并且可能赋空值,声明为指针。
  2. 如果变量肯定指向对象在你的设计不允许变量为空,则声明为引用。
  3. 重载某个操作符时,应该使用引用。最普通的例子是操作符[],返回一个目标对象,其能被赋值。
  1. v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值
  2. *v[5] = 10; // 如果操作符[]返回一个指针

引用和指针实现方式相同

  1. int i=2
  2. int& ref = i;
  3. int *p = &i;

第二三行的汇编实现:

  1. 8048727: 8d 44 24 1c lea 0x1c(%esp),%eax
  2. // esp寄存器里的变量i的地址传给eax
  3. 804872b: 89 44 24 18 mov %eax,0x18(%esp)
  4. //将寄存器eax中的内容(i的地址)传给寄存器中的变量ref,即int& ref=i
  5. 8048777: 8d 44 24 1c lea 0x1c(%esp),%eax
  6. // esp寄存器里的变量i的地址传给eax
  7. 804877b: 89 44 24 10 mov %eax,0x10(%esp)
  8. //将寄存器eax中的内容(即i的地址)传到寄存器esp中的p

两者实现方式相同,同时也说明了引用是需要占用空间的。

如果对象存在为空的可能性就不可使用引用,否则奔溃或输出是不确定的。

引用优点

  1. void printDouble(const double& rd)
  2. {
  3. cout << rd; // 不需要测试rd,肯定指向一个double值
  4. }
  5. //相反,指针则应该总是被测试,防止其为空:
  6. void printDouble(const double *pd)
  7. {
  8. if (pd) { // 检查是否为NULL
  9. cout << *pd;
  10. }
  11. }

参考
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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注