C++ 3/5 法則相關

double64發表於2024-09-15

複製建構函式

複製建構函式的第一個引數必須是一個引用型別。雖然我們可以定義一個接受非 const 引用的複製建構函式,但此引數幾乎總是一個 const 的引用
複製建構函式在幾種情況下都會被隱式地使用。因此,複製建構函式通常不應該是explicit的(參見 7.5.4節,第 265 頁)。

一般情況,合成的複製建構函式將其引數的成員逐個複製到正在建立的物件中(參見 7.1.5節,第 239 頁)。編譯器從給定物件中依次將每個非static成員複製到正在建立的物件中。

雖然我們不能直接複製一個陣列(參見 3.5.1節,第 102頁),但合成複製建構函式會逐元素地複製一個陣列型別的成員。如果陣列元素是類型別,則使用元素的複製建構函式來進行複製。

複製初始化通常使用複製建構函式來完成。但是,如我們將在13.6.2節(第473頁)見,如果一個類有一個移動建構函式,則複製初始化有時會使用移動建構函式而非複製造函式來完成。
但現在,我們只需瞭解複製初始化何時發生,以及複製初始化是依靠拷建構函式或移動建構函式來完成的就可以了。

複製初始化不僅在我們用=定義變數時會發生,在下列情況下也會發生

  • 將一個物件作為實參傳遞給一個非引用型別的形參
  • 從一個返回型別為非引用型別的函式返回一個物件
  • 用花括號列表初始化一個陣列中的元素或一個聚合類中的成員(參見7.5.5節,第266 頁)

某些類型別還會對它們所分配的物件使用複製初始化。例如,當我們初始化標準庫容器或是呼叫其 insert 或 push 成員(參見 9.3.1 節,第 306 頁)時,容器會對其元素進行複製初始化。
與之相對,用 emplace 成員建立的元素都進行直接初始化(參見9.3.1節,第308 頁)。

--《C++ Primer》 p441

解構函式

合成的規則和複製建構函式比較類似。

什麼時候會呼叫解構函式

無論何時一個物件被銷燬,就會自動呼叫其解構函式:

  • 變數在離開其作用域時被銷燬。
  • 當一個物件被銷燬時,其成員被銷燬。
  • 容器(無論是標準庫容器還是陣列)被銷燬時,其元素被銷燬。
  • 對於動態分配的物件,當對指向它的指標應用刪除運算子時被銷燬(參見12.1.2節,第409頁)。
  • 對於臨時物件,當建立它的完整表示式結束時被銷燬。

--《C++ Primer》 p445

相關文章