條款05 了解C 默默編寫並呼叫了哪些函式

2021-09-22 19:29:19 字數 1421 閱讀 4715

對於乙個empty class(空類),編譯器就會為它宣告(編譯器版本的)乙個copy建構函式,乙個copy assignment操作符和乙個析構函式,此外你沒有宣告任何建構函式,編譯器也會為你宣告乙個default建構函式。

如下所示:

//當你寫下如下的**:

class empty{};

//就像如下的**一樣:

class empty

; //default建構函式

empty(const empty& rhs) //copy建構函式

~empty; //析構函式,是否為虛見稍後說明

empty& operator = (const empty& rhs) ;//copy assignment操作符

};

唯有當這些函式被需要(呼叫),它們才會被編譯器建立出來。

對於這幾個函式而言作用:default構造和析構函式主要給編譯器乙個地方來放置「藏身幕後」的**,像是呼叫base classes和non-static成員變數的建構函式和析構函式。至於copy建構函式和copy assignment操作符,編譯器建立的版本只是單純的將源物件的每乙個non-static成員變數拷貝到目標物件。

編譯器生成的copy assignment操作符,其行為基本上和copy建構函式如出一轍,但一般而言只有當生成的**合法且有適當機會證明他有意義,其表現才會如我們所說的。萬一條件不符合,編譯器會拒絕為class生成operator=。

特殊的情況,如下namedobject定義如下,namevalue是個reference to string,objectvalue是個const t:

templateclass namedojbect

;std::string newdog("persephone");

std::string olddog("satch");

namedojbectp(newdog,2);

namedojbects(olddog,36);

p = s;//現在p的成員變數該發生什麼事

賦值之前,不論p.namevalue和s.namevalue都是指向string物件(不是同乙個),賦值動作該如何影響p.namevalue?因為c++不允許「讓乙個reference指向不同物件」。對面const成員也是如此,更改const成員時不合法的。

面對這問題,c++編譯器拒絕為其合成copy assignment,你必須自己定義copy assignment。最後還有一種特殊情況:如果某個base classes將copy assignment操作符宣告為private,編譯器也會拒絕為其derived classes生成乙個copy assignment操作符,畢竟編譯器為derived classes所生成的copy assignment操作符想象中可以處理base class成分。

條款05 了解C 默默編寫並呼叫哪些函式

條款05 了解c 默默編寫並呼叫哪些函式 編譯器可以暗自為class建立default建構函式,copy建構函式,copy assignment操作符,以及析構函式 唯有當這些函式被呼叫,它們才會被編譯器建立出來 include include using std cout using std en...

條款05 了解C 默默編寫並呼叫哪些函式

什麼時候乙個空類,不再是空類了呢?當c 編譯器處理之後。如果沒有定義,編譯器會為你產生四個函式 1 預設建構函式 2 copy建構函式 3 賦值建構函式 4 析構函式 注意這些函式都是public且是inline的。這裡還有一點要說明的 不是說編譯器一定會為你產生這些函式,而是說,當這些函式被呼叫時...

條款05 了解C 默默編寫並呼叫哪些函式

什麼時候empty class 空類 不再是個empty呢?當c 處理過它之後。如果你定義類的時候自己沒有宣告,編譯器就會為它宣告 編譯器版本的 乙個copy建構函式 乙個copy assignment操作符和乙個析構函式。如果你沒有宣告任何建構函式,編譯器也會為你宣告乙個default建構函式。所...