當定義乙個類時,我們顯式地或隱式地指定了此型別的物件在拷貝、賦值和銷毀時做什麼。乙個類通過定義三種特殊的成員函式來控制這些操作,分別是拷貝建構函式、賦值運算子和析構函式。
拷貝建構函式定義了當用同型別的另乙個物件初始化新物件時做什麼,賦值運算子定義了將乙個物件賦予同型別的另乙個物件時做什麼,析構函式定義了此型別的物件銷毀時做什麼。我們將這些操作稱為拷貝控制操作。
由於拷貝控制操作是由三個特殊的成員函式來完成的,所以我們稱此為「c++三法則」。在較新的 c++11 標準中,為了支援移動語義,又增加了移動建構函式和移動賦值運算子,這樣共有五個特殊的成員函式,所以又稱為「c++五法則」。也就是說,「三法則」是針對較舊的 c++89 標準說的,「五法則」是針對較新的 c++11 標準說的。為了統一稱呼,後來人們幹把它叫做「c++ 三/五法則」。
如果乙個類沒有定義所有這些拷貝控制成員,編譯器會自動為它定義預設的操作,因此很多類會忽略這些拷貝控制操作。但是,對於一些持有其他資源(例如動態分配的記憶體、開啟的檔案、指向其他資料的指標、網路連線等)的類來說,依賴這些預設的操作會導致災難,我們必須顯式的定義這些操作。
c++ 並不要求我們定義所有的這些操作,你可以只定義其中的乙個或兩個。但是,這些操作通常應該被看做乙個整體,只需要定義其中乙個操作,而不需要定義其他操作的情況很少見。
需要析構函式的類也需要拷貝和賦值操作
當我們決定是否要為乙個類顯式地定義拷貝建構函式和賦值運算子時,乙個基本原則是首先確定這個類是否需要乙個析構函式。通常,對析構函式的需求要比拷貝建構函式和賦值運算子
C 拷貝控制
本文主要討論c 類定義中的拷貝控制 copy control 拷貝建構函式 賦值操作符和析構函式。如果文中有錯誤或遺漏之處,敬請指出,謝謝!c 類中有四個不可或缺的部分,那就是建構函式 拷貝建構函式 賦值操作符和析構函式。如果類中沒有定義這些函式,那麼編譯器將為類自動生成這些函式。當然,你也可以通過...
C 拷貝控制
當定義乙個類時,顯示或隱式地指定了此型別的物件在拷貝 賦值和銷毀時所執行的操作,通過三個特殊的成員函式來控制這些操作,分別是拷貝建構函式,賦值運算子和析構函式。拷貝建構函式定義了當使用同型別的另乙個物件初始化新物件時的操作,賦值運算子定義了將乙個物件賦值給同型別的另乙個物件時的操作,析構函式定義了此...
C 拷貝控制
拷貝建構函式 如果有乙個建構函式第乙個引數是自身類型別的引用,且任何額外引數都有預設值,則此建構函式是拷貝建構函式。class foo 如果沒有為乙個類定義拷貝建構函式,編譯器會為我們定義乙個。拷貝建構函式不僅在我們用 定義變數時發生,也會在一下情況發生 拷貝賦值運算子 與拷貝建構函式一樣,如果類未...