寒江雪 要清楚C 自動生成的函式

2021-07-24 16:29:52 字數 1737 閱讀 8406

乙個空類,當c++處理它之後,會自動為它宣告乙個copy建構函式,乙個copy assignment操作符和析構函式。

而我們要知道c++生成這些函式都做了些什麼事情。

default建構函式

呼叫base-classes和non-static成員變數的建構函式

析構函式

呼叫base-classes和成員變數的析構函式

注意:編譯器所產生的析構函式是non-virtual的,除非這個class的base-class自身宣告有virtual析構函式才會帶有虛屬性

copy建構函式

單純地將**物件的每乙個non-static成員變數拷貝到目標物件。

copy assignment操作符

單純地將**物件的每乙個non-static成員變數拷貝到目標物件

如果乙個類中宣告了乙個建構函式,但是卻不是預設建構函式(非預設建構函式,預設建構函式的定義可以查閱相關資料),c++便不會再為該類生成default建構函式(就是沒有引數的建構函式,c++彷彿在說,你有了新歡,不需要我了,你想要預設建構函式,自己新增吧~~)。如下**所示,編譯器不會再為它產生預設建構函式了。知道這一點很重要,因為當我們多寫了乙個建構函式時,必須手動為類新增預設建構函式

template

class nameobject;

nameobject中沒有宣告copy建構函式和copy assignment操作符,所以編譯器會自動生成

nameobjectno1(「aaa」,1);

nameobjectno2(no1);

nameobejct中的成員變數有string型別,在呼叫copy 建構函式時,會使用no1.namevalue來呼叫string的copy 建構函式來初始化no2.namevalue。t為int,是內建型別,因此no2.objectvalue會複製no1.objectvalue所有bits來完成初始化

編譯器為nameobject生成的copy assignment操作符,其行為基本上與copy建構函式一樣。但一般而言,只有當生出的**合法且有適當機會證明它有意義,編譯器才會生產operator=

例如:template

class namedobject;

再看如下用法

std::string newdog(「persephone」);

std::string olddog(「satch」);

nameobjectp(newdog,2);

nameobjects(olddog,1);

p=s;

p的成員該如何變化

事實上, 編譯器會對最後一行報錯。因為編譯器並沒有為namedobject生成copy assignment操作符,你必須自己定義。

為什麼會這樣呢?由於namedobejct內包含reference成員和const成員。當面對這種情況的時候,編譯器手足無措,不知道該怎麼辦才好,於是它選擇死亡。(修改reference和const是不合法的)

還有另外一種情況:

如果某個類的基類將copyassignment操作符宣告為private,編譯器將拒絕為派生類生成copy assignment。畢竟編譯器為派生類生成的copy assignment操作符想象中可以處理基類成分,但是它們當然不能呼叫派生類無法呼叫的成員函式,於是編譯器再次選擇死亡

綜上所述,我們應該知道編譯器都為我們生成了什麼**,這些**都做了什麼, 還有什麼時候編譯器不會為我們生成**,我們應該手動新增。

C 編譯器為類自動生成的函式

我們可以構建乙個空類,class empty 儘管沒有定義任何函式,但我們可以通過以下方式使用這個類 empty e1 empty e2 e1 e2 e1 因為當編譯器發現你用上述方式使用這個類而卻在類宣告中沒有定義一般建構函式 非複製建構函式 複製建構函式 賦值操作符過載函式和析構函式時,會自動為...

C 類編譯器自動生成函式的實現

在c 中,乙個類有八個預設函式 預設建構函式 預設拷貝建構函式 預設析構函式 預設過載賦值運算子函式 預設過載取址運算子函式 預設過載取址運算子const函式 預設移動建構函式 c 11 預設過載移動賦值操作符函式 c 11 class myclass c 預設建構函式是對類中的引數提供預設值的建構...

C 編譯器自動生成拷貝建構函式的情況

編譯器在下面幾種情況下會給程式設計師沒有提供拷貝建構函式的類自動生成拷貝建構函式 1.類中有虛函式 當這個類中有虛函式的時候,意味著這個類的物件中一定包含了指向其虛函式表的指標 試想,如果講該類的派生類的物件作為該類的初始化物件,即 b繼承a class a private int m a publ...