當定義乙個類時,顯示或隱式地指定了此型別的物件在拷貝、賦值和銷毀時所執行的操作,通過三個特殊的成員函式來控制這些操作,分別是拷貝建構函式,賦值運算子和析構函式
。拷貝建構函式定義了當使用同型別的另乙個物件初始化新物件時的操作,賦值運算子定義了將乙個物件賦值給同型別的另乙個物件時的操作,析構函式定義了此型別的物件銷毀時執行的操作,這些操作統稱為拷貝控制操作
如果乙個類沒有定義所有這些拷貝控制成員,編譯器會自動為它定義預設的操作,因此很多類會忽略這些拷貝控制操作。但是,對於一些持有其他資源(例如動態分配的記憶體、開啟的檔案、指向其他資料的指標、網路連線等)的類來說,使用這些預設的操作無法滿足實際需求,切會導致嚴重的後果,因此必須顯式的定義這些操作。
c++ 並不要求我們定義所有的這些操作,你可以只定義其中的乙個或兩個。但是,這些操作通常應該被看做乙個整體,只需要定義其中乙個操作,而不需要定義其他操作的情況很少見。
1. 需要析構函式的類也需要拷貝和賦值操作
是否需要為乙個類顯示的定義拷貝建構函式和過載賦值運算子,乙個基本的原則就是首先確定這個類是否需要乙個析構函式。通常對析構函式的需求通常比拷貝建構函式和過載賦值運算子更加明顯,如果乙個類需要定義析構函式,那麼幾乎可以確定這個類也需要拷貝建構函式和過載賦值運算子。
2. 需要拷貝操作的類也需要賦值操作,反之亦然
很多類需要定義拷貝控制成員,但是有些類所要完成的工作,只需要拷貝或者賦值操作,不需要析構操作。比如說乙個類為每乙個物件分配乙個獨有的,唯一的id,這個類需要乙個拷貝建構函式來為每個新建立的物件生成乙個新的id,,還需要過載賦值運算子來避免將乙個物件的id賦值給另乙個物件,但是這個類並不需要析構函式。也就是說,如果乙個類需要乙個拷貝建構函式,幾乎可以肯定也需要過載賦值運算子,反之亦然。但是,無論需要拷貝建構函式還是需要過載賦值運算子,都不必然意味著需要析構函式。
C 拷貝控制
本文主要討論c 類定義中的拷貝控制 copy control 拷貝建構函式 賦值操作符和析構函式。如果文中有錯誤或遺漏之處,敬請指出,謝謝!c 類中有四個不可或缺的部分,那就是建構函式 拷貝建構函式 賦值操作符和析構函式。如果類中沒有定義這些函式,那麼編譯器將為類自動生成這些函式。當然,你也可以通過...
C 拷貝控制
當定義乙個類時,顯示或隱式地指定了此型別的物件在拷貝 賦值和銷毀時所執行的操作,通過三個特殊的成員函式來控制這些操作,分別是拷貝建構函式,賦值運算子和析構函式。拷貝建構函式定義了當使用同型別的另乙個物件初始化新物件時的操作,賦值運算子定義了將乙個物件賦值給同型別的另乙個物件時的操作,析構函式定義了此...
C 拷貝控制
拷貝建構函式 如果有乙個建構函式第乙個引數是自身類型別的引用,且任何額外引數都有預設值,則此建構函式是拷貝建構函式。class foo 如果沒有為乙個類定義拷貝建構函式,編譯器會為我們定義乙個。拷貝建構函式不僅在我們用 定義變數時發生,也會在一下情況發生 拷貝賦值運算子 與拷貝建構函式一樣,如果類未...