成員函式 | 類 C 的典型形式: |
---|---|
預設建構函式 | C::C(); |
解構函式 | C::~C(); |
複製建構函式 | C::C (const C&); |
複製賦值 | C& operator= (const C&); |
移動建構函式 | C::C (C&&); |
移動賦值 | C& operator= (C&&); |
|
|
Example
有一個預設建構函式。因此,可以透過簡單地宣告它們而不帶任何引數來構造該類的物件:
|
|
|
|
int
型別引數的建構函式。因此,下面的物件宣告是正確的:
|
|
|
|
|
|
bar's content: Example |
Example3
有一個被定義為空程式碼塊的預設建構函式(即一個無引數的建構函式):
|
|
Example3
的物件可以無引數地構造(如此例中宣告的 foo
)。通常情況下,對於所有沒有其他建構函式的類,這樣的預設建構函式會被隱式定義,因此不需要顯式定義。但在本例中,Example3
有另一個建構函式:
|
|
void
都不返回。它也使用類名作為自己的名字,但前面加上一個波浪號(~
)。
|
|
bar's content: Example |
Example4
為一個 string
分配儲存空間。該儲存空間稍後由解構函式釋放。foo
和 bar
,這發生在 main
函式的末尾。const
限定的),並且可以用這種型別的單個引數來呼叫。例如,對於一個類 MyClass
,複製建構函式可能具有以下簽名:
|
|
|
|
|
|
Example4
這樣的類,這可能不是我們所期望的,因為它包含了它自己管理儲存的指標。對於那個類,執行淺複製意味著指標的值被複製了,但內容本身沒有;這意味著兩個物件(副本和原始物件)將共享同一個 string
物件(它們都將指向同一個物件),並且在某個時刻(在析構時)兩個物件都將嘗試刪除同一塊記憶體,這很可能導致程式在執行時崩潰。這可以透過定義一個執行深複製的自定義複製建構函式來解決:
|
|
bar's content: Example |
|
|
baz
是在構造時使用等號初始化的,但這並不是一個賦值操作!(儘管它可能看起來像):物件的宣告不是賦值操作,它只是呼叫單引數建構函式的另一種語法。foo
的賦值是一個賦值操作。這裡沒有宣告任何物件,而是在一個已存在的物件 foo
上執行一個操作。operator=
的一個過載,它接受類本身的值或引用作為引數。返回值通常是對 *this
的引用(儘管這不是必需的)。例如,對於一個類 MyClass
,複製賦值運算子可能具有以下簽名:
|
|
Example5
。在這種情況下,該類不僅面臨著兩次刪除所指向物件的風險,而且賦值操作還會因未在賦值前刪除物件所指向的物件而造成記憶體洩漏。這些問題可以透過一個複製賦值運算子來解決,它會刪除舊的物件並執行深複製:
|
|
string
成員不是常量,它可以重用同一個 string
物件:
|
|
|
|
fn
返回的值和用 MyClass
構造的值都是未命名的臨時物件。在這些情況下,沒有必要進行複製,因為未命名物件的生命週期非常短,當這是一個更高效的操作時,它的資源可以被另一個物件獲取。
|
|
&&
)來指定。作為引數,一個右值引用匹配該型別的臨時物件引數。
|
|
foo's content: Example |
成員函式 | 隱式定義 | 預設定義 |
---|---|---|
預設建構函式 | 如果沒有其他建構函式 | 什麼都不做 |
解構函式 | 如果沒有解構函式 | 什麼都不做 |
複製建構函式 | 如果沒有移動建構函式和移動賦值運算子 | 複製所有成員 |
複製賦值 | 如果沒有移動建構函式和移動賦值運算子 | 複製所有成員 |
移動建構函式 | 如果沒有解構函式、複製建構函式、複製或移動賦值運算子 | 移動所有成員 |
移動賦值 | 如果沒有解構函式、複製建構函式、複製或移動賦值運算子 | 移動所有成員 |
default
和 delete
來顯式選擇這些成員中的哪些存在其預設定義,或者哪些被刪除。語法是以下之一:function_declaration = default; function_declaration = delete; |
|
|
bar's area: 200 |
Rectangle
可以用兩個 int
引數構造,也可以被預設構造(無引數)。然而,它不能從另一個 Rectangle
物件進行複製構造,因為這個函式已經被刪除了。因此,假設有上一個例子中的物件,下面的語句將是無效的:
|
|
|
|
|
|
default
並不定義一個與預設建構函式(即無引數建構函式)相等的成員函式,而是定義一個與(如果未被刪除)本應被隱式定義的建構函式相等的函式。delete
或 default
。![]() 類 (II) | ![]() 目錄 | ![]() 友元和繼承 |