在Thiking in C++中,专门有一章来讲解References & the Copy-Constructor这个主题,讲解得比较透彻。根据英文的Copy-Constructor,“拷贝构造函数”是一个名词,而不是动宾结构的短语。我用我的方法对这一问题琢磨了一下,在本文的最后有完整的代码。
1. Pass-By-Reference
在C++里可以使用引用(reference)&符号来传递参数,被称为pass-by-reference,其效果与通过指针引用(pass-by-pointer)是一样的,都能够在函数体内修改外部变量的值。例如:
#include <iostream> using namespace std; void test1(int & a) { a += 1; }
void test2(int * a) { *a += 1;} int main(void) {
int a = 1; cout << a << endl; test1(a); cout << a << endl; test2(&a); cout << a << endl; return (0); }
test1和test2都能够起到把a的值增1的作用。我在IA32的CPU和WinXP Sp2上用VC7编译这段代码,并把这段在 VC中反汇编。不熟悉IA32汇编语言的朋友可以忽略汇编代码而直接看我的结论,使用Linux的朋友可以用gcc和gdb来做类似的工作。忽略掉与我们这个主题无关的代码后能够看到:
void test1(int & a) {
0041B1A0 push ebp 0041B1A1 mov ebp,esp 0041B1A3 sub esp,0C0h 0041B1A9 push ebx 0041B1AA push esi 0041B1AB push edi 0041B1AC lea edi,[ebp-0C0h] 0041B1B2 mov ecx,30h 0041B1B7 mov eax,0CCCCCCCCh 0041B1BC rep stos dword ptr [edi] a += 1; 0041B1BE mov eax,dword ptr [a] 0041B1C1 mov ecx,dword ptr [eax] 0041B1C3 add ecx,1 0041B1C6 mov edx,dword ptr [a] 0041B1C9 mov dword ptr [edx],ecx} 0041B1CB pop edi 0041B1CC pop esi 0041B1CD pop ebx 0041B1CE mov esp,ebp 0041B1D0 pop ebp 0041B1D1 ret
void test2(int * a) {
0041B1E0 push ebp 0041B1E1 mov ebp,esp 0041B1E3 sub esp,0C0h 0041B1E9 push ebx 0041B1EA push esi 0041B1EB push edi 0041B1EC lea edi,[ebp-0C0h] 0041B1F2 mov ecx,30h 0041B1F7 mov eax,0CCCCCCCCh 0041B1FC rep stos dword ptr [edi]