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

2021-08-05 19:12:13 字數 1344 閱讀 6248

// 條款05: 了解c++默默編寫並呼叫哪些函式

// 編譯器可以暗自為class建立default建構函式,copy建構函式,copy assignment操作符,以及析構函式

// 唯有當這些函式被呼叫,它們才會被編譯器建立出來

#include #include using std::cout;

using std::endl;

using std::string;

// 1.編譯器產出的析構函式是non-virtual的

// 2.如果class中宣告了乙個建構函式,那麼編譯器就不會在為其建立default建構函式

// 3.如果class中宣告了有參或者無參建構函式,那麼編譯器可能會為其建立copy建構函式

// 4.編譯器自動產生的copy assignment行為基本和自動產生的copy建構函式一樣

// 5.編譯器自動生成copy assignment操作符後,可能拒絕編譯某個賦值動作,比如這個類

// 內含reference成員,因為c++不允許reference指向不同的物件,只能初始化時指定乙個;

// 或者內含const成員,因為更改const成員是不合法的。

// 還有一種情況父類將copy assignment宣告為private,編譯器拒絕為其子類生成乙個copy assignment,

// 因為子類不能處理父類的class成分。

class student05

public:

int m_age;

char* m_pname;

string m_address;

};class student052

public:

const char* m_pname;

string& m_address;

};class empty ;

int main()

empty e2(e1); // 編譯器建立了copy建構函式: empty(const empty& e){}

e2 = e1; // 編譯器建立了copy assignment操作符: empty& operator=(const empty& e) {}

// 編譯器建立了析構函式:~empty(){}

char* test_str = "aaaa";

//test_str[1] = '1'; // 崩潰,因為"aaaa"為字串常量,放在了常量儲存區,只使用指標test_str來指向它了

char test_arr = "abcde";

test_arr[1] = 'a'; // 正確

return 0;

}

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

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

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

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

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

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