读书人

C++ 中引述的背后

发布时间: 2013-03-16 11:51:46 作者: rapoo

C++ 中引用的背后
几个问题:

1. 引用变量占有内存空间吗?

2. 引用是怎样工作的?

3. 指针是怎样工作的?

4. 引用和指针有什么区别?


1. 何为引用

《C++ Primer》里面是这样说的“引用(Reference)就是对象的另一个名字,引用只是它绑定的对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上”,这句话概括得很彻底


2. 引用占有内存空间吗?

一段C++代码:


使用 /FAs 编译选项,得到的汇编代码如下:

PUBLIC_main_TEXTSEGMENT_a$ = -4_ref$ = -8_mainPROC NEAR; 4    : int main() {pushebpmovebp, espsubesp, 8; 5    :   int  a = 100;movDWORD PTR _a$[ebp], 100; [ebp-4]是a的地址; 6    :   int& ref = a;leaeax, DWORD PTR _a$[ebp]movDWORD PTR _ref$[ebp], eax; [ebp-8]是ref的内存地址,保存的是 a 的地址; 7    :   ref = 5;movecx, DWORD PTR _ref$[ebp]; 先从ref的内存中取出 a 的地址movDWORD PTR [ecx], 5; 再对 a 进行间接的操作,直接影响了 a 的值

至于指针的话,自己去探索一下,其工作的机制是类似的


4. 引用和指针的区别

引用和指针都是通过间接的手段直接影响原对象的。

1. 对于指针来说,指针可以不指向任何一个对象(指向NULL),而引用自初始化后就与某个对象绑定了,引用必须在定义的时候就进行初始化,因为引用本身不能与空对象进行绑定

2. 在某种程度上说,比如测试,引用的代码效率比指针高,因为引用总是与某个对象进行绑定,而指针则不然(这点摘自《More Effective C++》Item M1)

3. 引用自定义后就“从一而终”地与某个对象绑定,任何试图让其绑定其它对象的做法都是被禁止的;而指针是相当灵活的,它可以改变其指向的对象,在指针范畴上,不存在“绝对的绑定”
总的来说,如果你需要在任何时刻都能够改变指向的对象时,应该用指针而不是引用;如果你希望总是指向某个对象并且这个指向关系是“从一而终”的,那么你应该使用引用而不是指针


读书人网 >C++

热点推荐