c 為你做了什麼(1)構造 析構 拷貝 賦值

2021-07-06 06:44:10 字數 1937 閱讀 4629

effective c++

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

如果你自己沒宣告,編譯器會為你的類宣告乙個編譯器版本的 copy建構函式 乙個assignment操作符 乙個default建構函式 和乙個析構函式。

目的:為了編譯器的需要而不是程式的需要

方式: inline的方式(避免在不同編譯單元中生成多版本的建構函式 ,inline函式有static_link屬性在編譯單元外不可見)

1.建構函式:

對於 class x; 如果沒有任何 user-declared constructor ,那麼將會有乙個default constructor被隱式的宣告出來,乙個被隱式宣告出來的 default constructor 將會是乙個trivial 的 constructor.....

有四 種情況,會造成編譯器必須為未宣告congstructor的classes 合成乙個d efault constructor。 被合成出來的constructor只能滿足編譯器(非程式設計師)的需要,他之所以能夠完成任務,是藉著呼叫 member object 或 base class 的 default constructor 或是為每乙個object初始化其virtual function機制或者 virtual base class機制(生成虛函式表和指標)而完成的。如果不是以上情況,我們說他們擁有的是 implicit trivial default constructors ,他們實際上並不會被合成出來。

在合成的 default constructor中只有 base class subobjects 和 member class objects 會被初始化。其他的所有 nonstatic data member 都不會被初始化。

常見的誤解

1.任何 class 如果沒有定義 default constructor 就會被合成出來

2.編譯器合成出來的default constructor 會顯式設定 「class 內每乙個data member 的預設值」

2.拷貝建構函式

同建構函式,c++ standard 把copy construcor 區分為 trivial和nontrivial兩種。只有nontrivial的例項才會被合成於例項中。決定乙個copy constructor 是否為 trivial的標準在於 class 是否展現出所謂的 「bitwise copy semantics」(位逐次拷貝),(tips:對於成員變數含有類,拷貝是遞迴的)

位逐次拷貝性下不合成拷貝建構函式

不展現bitwise copy semantic的情況

1. 當class 內含乙個 member object 而後者的 class 宣告有乙個 copy constructor 時。

2.當 class繼承自乙個 base class而後者存在乙個 copy constructor時

3. 當 class 宣告了乙個或多個 virtual functions時。

4. 當 class 派生自乙個繼承串鏈,其中有乙個或多個 virtual base classes 時。

多型的實現虛機制:

當乙個函式被宣告為虛函式,編譯器會為其生成乙個虛函式表,同時維護乙個虛指標,虛函式表記錄所有基類和派生類的函式函式位址,虛指標指向當前物件的函式位址。

(多型必須藉由指標機制實現)

深拷貝和淺拷貝

在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!

關於虛函式:

在使用memcpy() memset()時,都只有在「classes 不含任何由編譯器產生的內部 members」時才會有效執行,如果類宣告乙個或乙個以上的 virtual functions ,或內含乙個 virutal base class ,那麼使用上述函式將會導致那些被編譯器產生的內部 members 的初值被改寫。

C 拷貝構造 拷貝複製 析構函式

帶有指標的成員的類必須有拷貝建構函式和拷貝賦值函式,淺拷貝預設的賦值函式會將乙個指標賦值給另乙個,導致進行賦值的物件指標指向的內容記憶體洩漏 string.h ifndef mystring define mystring class string private char m data endif...

C 建構函式 拷貝構造 析構函式

建構函式 constructor 在例項物件時,系統自動呼叫,用來初始化物件的資料成員 建構函式宣告語法 類名 引數列表 建構函式注意點 include include using namespace std class computer 上面的建構函式也可以寫成引數列表初始化的形式 compute...

c 建構函式 拷貝,賦值,析構

建構函式 可以參考 作用 為物件成員變數賦初始值。new運算子一起使用 注意 1.建構函式的命名必須和類名完全相同 2.沒有返回值,即不用在定義時加返回值型別 void int float之類的 3.建構函式不能被直接呼叫,必須通過new運算子在建立物件時才會自動呼叫 拷貝函式 可自定義 思路就是賦...