C++中的引用
以下所有代码均在VC6.0得到,源代码:
int i = 10;
int &j = i;
int *p = &i;
*p = 100;
j = 100;
int &j = i;
int *p = &i;
*p = 100;
j = 100;
汇编:
46: int i = 10;
00438469 mov dword ptr [ebp-58h],0Ah //将10放到ebp-58h处
47: int &j = i;
00438470 lea eax,[ebp-58h] //eax 为ebp-58h
00438473 mov dword ptr [ebp-5Ch],eax //将eax移到j处(ebp-5Ch)
48: int *p = &i;
00438476 lea ecx,[ebp-58h]
00438479 mov dword ptr [ebp-10h],ecx
49: *p = 100;
0043847C mov edx,dword ptr [ebp-10h]
0043847F mov dword ptr [edx],64h
50: j = 100;
00438485 mov eax,dword ptr [ebp-5Ch] //将j的值移到eax中
00438469 mov dword ptr [ebp-58h],0Ah //将10放到ebp-58h处
47: int &j = i;
00438470 lea eax,[ebp-58h] //eax 为ebp-58h
00438473 mov dword ptr [ebp-5Ch],eax //将eax移到j处(ebp-5Ch)
48: int *p = &i;
00438476 lea ecx,[ebp-58h]
00438479 mov dword ptr [ebp-10h],ecx
49: *p = 100;
0043847C mov edx,dword ptr [ebp-10h]
0043847F mov dword ptr [edx],64h
50: j = 100;
00438485 mov eax,dword ptr [ebp-5Ch] //将j的值移到eax中
00438488 mov dword ptr [eax],64h //将100移到ecx所存储的地址,也就是i中
结论:
可以看到,指针和引用产生的代码基本相同, 所以对于编译器来说, 引用就是指针. 但指针与引用的语意又不相同, 比如我们声明一个类对象的引用, 就只能通过"."运算符来访问对象的成员
为什么C++要引入引用:
首先声明只是个人想法.
当我们实现一个运算符重载时, 都需要返回一个*this, 以支持这样的操作X+X1+X2+X3, 若过没有引用的话, 我们只能返回指针, X+X1+X2+X3可能要写成
*(*(X+X1)+X2)+X3这种形式了, 所以引用的引入,使代码更符合习惯. 当然引用也可以提高效率.
对象基于栈和堆的C++,要比对象基于堆的delphi在操作上要复杂一些