| 1:C++類里面無(wú)論如何都會(huì)有一個(gè)拷貝構(gòu)造函數(shù)(隱含的或者顯示的),是這樣的嗎? 2:大學(xué)課本里是這樣寫(xiě)的若一個(gè)類不帶有拷貝構(gòu)造函數(shù),則系統(tǒng)為該類隱含定義一個(gè)拷貝構(gòu)造函數(shù)(出自<<C++語(yǔ)言基礎(chǔ)教程>>第245頁(yè))真是這樣的嗎? 當(dāng)追根究底其實(shí)都是錯(cuò)的,拷貝構(gòu)造函數(shù)未必必須有,想想如果一個(gè)類一點(diǎn)都不復(fù)雜,編譯器還要定義一個(gè)拷貝構(gòu)造函數(shù),進(jìn)行一次函數(shù)的調(diào)用操作,對(duì)程序運(yùn)行的效率將是多么大的傷害呀? 
 C++標(biāo)準(zhǔn)是這樣寫(xiě)的: 默認(rèn)拷貝構(gòu)造函數(shù)是在必要的時(shí)候由編譯器進(jìn)行合成的,這里是在必要的時(shí)候而不是一定,不是嗎  證明: 程序一: class A
{
private:
	int a;
	char *str;
};
int main()
{
	A a;
	A b=a;
	return 0;
}按照書(shū)中寫(xiě)的,在A b=a時(shí)會(huì)發(fā)生拷貝構(gòu)造函數(shù)的調(diào)用操作,是這樣的吧:),讓我們進(jìn)入?yún)R編代碼看看真的是這樣的嗎,調(diào)試進(jìn)入?yún)R編代碼運(yùn)行 11: A a; 12: A b=a; 00401048 mov eax,dword ptr [ebp-8] 0040104B mov dword ptr [ebp-10h],eax 0040104E mov ecx,dword ptr [ebp-4] 00401051 mov dword ptr [ebp-0Ch],ecx 你看到有A:A( A &a)這樣的函數(shù)調(diào)用操作嗎?我是沒(méi)有看到:),有的只是通過(guò)寄存器以及堆棧操作來(lái)進(jìn)行的復(fù)制操作(即按比特位進(jìn)行的復(fù)制操作),拷貝構(gòu)造函數(shù)是不會(huì)產(chǎn)生的。 程序二: class A
{
private:
	int a;
	string str;
};
int main()
{
	A a;
	A b=a;
	return 0;
}同樣,按照書(shū)中寫(xiě)的,在A b=a時(shí)會(huì)發(fā)生拷貝構(gòu)造函數(shù)的調(diào)用操作,是這樣的吧:),讓我們進(jìn)入?yún)R編代碼看看真的是這樣的嗎,調(diào)試進(jìn)入?yún)R編代碼運(yùn)行 11: A a; 0040117D lea ecx,[ebp-20h] 00401180 call @ILT+55(A::A) (0040103c) 00401185 mov dword ptr [ebp-4],0 12: A b=a; 0040118C lea eax,[ebp-20h] 0040118F push eax 00401190 lea ecx,[ebp-34h] 00401193 call @ILT+140(A::A) (00401091) 13: return 0; 
 
 你看到有A:A( A &a)這樣的函數(shù)調(diào)用操作嗎?看到了吧,拷貝構(gòu)造函數(shù)產(chǎn)生了,這是為什么呢。 A::A:
004012A0   push        ebp
004012A1   mov         ebp,esp
004012A3   sub         esp,44h
004012A6   push        ebx
004012A7   push        esi
004012A8   push        edi
004012A9   push        ecx
004012AA   lea         edi,[ebp-44h]
004012AD   mov         ecx,11h
004012B2   mov         eax,0CCCCCCCCh
004012B7   rep stos    dword ptr [edi]
004012B9   pop         ecx
004012BA   mov         dword ptr [ebp-4],ecx
004012BD   mov         eax,dword ptr [ebp-4]
004012C0   mov         ecx,dword ptr [ebp+8]
004012C3   mov         edx,dword ptr [ecx]
004012C5   mov         dword ptr [eax],edx
004012C7   mov         eax,dword ptr [ebp+8]
004012CA   add         eax,4
004012CD   push        eax
004012CE   mov         ecx,dword ptr [ebp-4]
004012D1   add         ecx,4
004012D4   call        @ILT+150(std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_str
004012D9   mov         eax,dword ptr [ebp-4]
004012DC   pop         edi
004012DD   pop         esi
004012DE   pop         ebx
004012DF   add         esp,44h
004012E2   cmp         ebp,esp
看到了沒(méi),紅色的,這是因?yàn)槌蓡T類對(duì)象含有拷貝構(gòu)造函數(shù),所以編譯器要合成一個(gè)拷貝構(gòu)造函數(shù)用以調(diào)用成員類對(duì)象的拷貝構(gòu)造函數(shù),對(duì)類對(duì)象的數(shù)據(jù)成員進(jìn)行復(fù)制操作 其實(shí)上面的程序一構(gòu)造函數(shù)與析構(gòu)函數(shù)均不會(huì)合成,可以看一下這篇博客C++類一定有構(gòu)造函數(shù)嗎 在以下四種情況會(huì)產(chǎn)生默認(rèn)拷貝構(gòu)造函數(shù) 1:類的成員類對(duì)象有拷貝構(gòu)造函數(shù) 2:類繼承的基類含有拷貝構(gòu)造函數(shù) 3:類含有虛函數(shù) 4:類繼承于虛基類 | 
|  |