小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C++類一定有拷貝構(gòu)造函數(shù)嗎 | 學(xué)步園

 牛人的尾巴 2017-01-08

C++類一定有拷貝構(gòu)造函數(shù)嗎

2017年01月06日 ? 編程語(yǔ)言 ? 共 1868字 ? 字號(hào) ? 評(píng)論關(guān)閉

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:類繼承于虛基類

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多