C 中類的複製控制

2021-06-08 19:53:10 字數 2514 閱讀 6650

每種型別,無論是內建型別還是類型別,都對該型別物件的一組操作進行了定義。

每種型別還定義了建立該型別的物件時會發生什麼……

建構函式:該類型別物件的初始化。

當定義乙個新型別的時候,需要顯式或者隱式地指定複製,賦值和撤銷該型別的物件時會發生什麼,這是通過定義特殊成員:複製建構函式,賦值操作符和析構函式來達到。如果沒有顯式定義,編譯器會為我們定義。

複製建構函式(拷貝建構函式):

具有單個形參,該形參(常用const修飾)是對該類型別的引用。當定義乙個新物件並用乙個同型別的物件對它進行初始化時,常顯式使用複製建構函式。當該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式。

析構函式:是建構函式的互補:當物件超出作用域或動態分配的物件被刪除時,將自動呼叫析構函式。析構函式用於釋放物件構造時構造或者在物件的生命週期中所獲取的資源。不管是否定義自己的析構函式,編譯器都自動執行類中非static資料成員的析構函式。

賦值操作符:賦值操作符可以通過指定不同型別的右運算元而過載。

右運算元為型別的版本比較特殊,如果我們沒有編寫這種函式,編譯器將為我們合成乙個。

實現複製控制操作最困難的部分,往往在於識別何時需要覆蓋預設版本,有一種特別常見的情況需要類定義自己的複製控制成員:

類具有指標成員

複製建構函式可用於:

1 根據另乙個同型別的物件顯示或隱式初始化乙個物件。

2 複製乙個物件,將它作為實參傳給乙個函式

3 從函式返回時複製乙個物件;

4 初始化容器中的元素

5 根據元素初始化列表初始化陣列元素

c++支援兩種初始化形式:直接初始化和複製初始化

直接初始化:int ival(1024);

複製初始化:int ival=1024;

對於類型別物件而言

直接初始化直接呼叫與實參匹配的建構函式

複製初始化總是呼叫複製建構函式

複製初始化首先指定建構函式建立乙個臨時物件,然後用複製建構函式將那個臨時建立的物件複製到正在建立的物件。

合成複製建構函式:

如果我們沒有定義複製建構函式,編譯器就會為我們合成乙個。即使我們定義了其他建構函式,也會合成複製建構函式,合成複製建構函式的行為是,執行逐個成員初始化,將新物件初始化為原物件的副本。

所謂「逐個成員」,指的是編譯器將現有物件的每個非static成員,依次複製到正在建立的物件。複製的方法為:每個成員的型別決定了複製該成員的含義,

合成複製建構函式直接複製內建型別成員的值,類型別成員使用該類的複製建構函式進行複製。陣列成員的複製是個例外,雖然一般不能複製陣列,但是如果乙個類具有陣列成員,則合成複製建構函式將複製陣列,複製陣列時合成複製建構函式將複製陣列的每乙個元素。

定義複製建構函式最難的部分在於認識到需要複製建構函式!!!,只要能認識到需要複製建構函式,定義建構函式一般非常簡單。與類同名,沒有返回值

禁止複製

有些類需要完全禁止複製,比如iostream。如果想要禁止複製,似乎可以省略複製建構函式,但是!!如果不定義複製建構函式,編譯器將合成乙個。

為了防止複製,類必須顯式宣告其複製建構函式為private 。-------但是,類的友元和成員仍然可以複製,如果想連友元和成員中的複製也禁止,就可以

宣告乙個private複製建構函式但不對其進行定義。

宣告而不定義成員函式是合法的。通過宣告(但不定義)private複製建構函式:

使用者**中的複製嘗試將在編譯時標出錯誤,而成員函式和友元中的複製嘗試將在鏈結時導致錯誤。

如果定義了複製建構函式,也必須定義預設建構函式。。。

賦值操作符:

與複製建構函式一樣,如果類沒有定義自己的賦值操作符,則編譯器會合成乙個。。。。

大多數成員函式可以定義為成員函式或非成員函式。當操作符為成員函式時,它的第乙個運算元隱式繫結到this指標。

複製和賦值常一起使用,如果需要其中乙個,我們幾乎也可以肯定需要另乙個

析構函式:

動態分配的物件只有在指向該物件的指標被刪除時才撤銷,如果沒有刪除指向動態物件的指標,則不會執行該物件的析構函式,物件就一直存在,從而導致記憶體洩漏。

容器中的元素總是按照逆序撤銷。

三法則:如果類需要析構函式,則它也需要賦值操作符合複製建構函式,這是乙個有用的經驗法則。

編譯器總會為我們合成乙個析構函式。即使編寫了自己的析構函式。。

合成析構函式並不刪除指標成員所指向的物件。

**示例:

#include #include using namespace std;

class namestr

namestr(const char *pname, const char *pdata)

namestr(const namestr& other)

namestr& operator=(const namestr& other)

~namestr()

void print()

private:

char *m_pname;

char *m_pdata;

};int main()

11 C 類複製控制

類複製控制 前言,定義,基類與派生類,設計指導 1.前言 複製控制通常指類的複製建構函式,賦值操作運算子,析構函式 1.1複製建構函式 引入複製建構函式是為了讓類的物件直接生成另乙個物件,同時把此物件的資料複製到另乙個物件中 如果類中沒有實現複製建構函式,編譯器自動新增乙個,如果我們不需要,則把它明...

C 複製控制

當定義乙個新型別時,通過使用複製建構函式,賦值操作符,析構函式來顯示或隱式地完成物件的複製,賦值,撤銷 1.複製建構函式 只有單個形參,而且該形參是對本類型別物件的引用 通常是const修飾 的建構函式,稱為 複製函式可用於 color red 1 根據另乙個同型別的物件顯示或隱式初始化乙個物件.2...

C 複製控制

1 複製建構函式 只有單個形參,而且該形參是對本類型別物件的引用 常用const修飾 這樣的建構函式稱為複製建構函式。直接初始化呼叫的是實參匹配的建構函式,複製初始化呼叫的複製建構函式。複製初始化首先使用指定建構函式建立乙個臨時物件,然後用複製建構函式將那個臨時物件複製到正在建立的物件。合成的複製建...