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

2021-09-08 21:51:51 字數 1131 閱讀 9089

什麼時候乙個空類,不再是空類了呢?當c++編譯器處理之後。

如果沒有定義,編譯器會為你產生四個函式:

1)  預設建構函式

2)  copy建構函式

3)  賦值建構函式

4)  析構函式

注意這些函式都是public且是inline的。

這裡還有一點要說明的:不是說編譯器一定會為你產生這些函式,而是說,當這些函式被呼叫時,它們才會被編譯器建立出來。

下面主要談一談賦值建構函式:

舉乙個例子:

template

class namedobject{

public:

namedobject(std::string& name, const t& value);

private:

std::string& namevalue;

const t objectvalue;

現在考慮下面會發生什麼事情:

std::string newdog("persephone");

std::string olddog("satch");

namedobjectp(newdog, 2);

namedobjects(olddog, 36);

p = s;

賦值前,不論p.namevalue和s.namevalue都指向string物件(當然不是同乙個)。賦值操作之後,p.namevalue會怎麼樣呢?

如果說p.namevalue賦值後,會指向s.namevalue,則你就錯了。為什麼?

因為namevalue這個東西是乙個指向string物件的引用。c++明文規定:不允許改變引用。

另乙個問題:objectvalue會怎麼樣呢,p.objectvalue 會等於36嗎?不會,為什麼?

因為在類中,objectvalue是const成員。不允許為const成員改變值。

那麼我們怎麼做賦值建構函式呢?我們要自己定義,這時,如果我們沒有定義賦值建構函式,c++會拒絕此物件的一切賦值。

另乙個例子,如果在base類中,我們把賦值建構函式定義為私有成員。派生類的賦值會怎麼樣呢?

這時,如果我們沒有定義賦值建構函式,則c++會拒絕這些賦值操作。因為在賦值時,會讓基類成員呼叫基類自己的賦值建構函式,但是這時是私有的,所以就會出問題。

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

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

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

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

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

每乙個class都會有乙個或多個建構函式 乙個析構函式 乙個copy assignment操作符。這些控制著基礎操作,像是產出新物件並確保它被初始化 擺脫舊物件並確保它被適當清理 以及賦予物件新值。那麼當你當你編寫了乙個empty class的時候,當你利用編譯器的對 進行處理的時候,它其實已經並非...