c 拷貝建構函式 拷貝運算子 析構函式

2022-09-08 06:27:11 字數 2661 閱讀 5045

拷貝建構函式、拷貝運算子、析構函式

class hasptr{

public:

hasptr(const string &s = string()):ps(new string(s)), i(0) {

cout<

hasptr hp("hello"); // 呼叫建構函式,輸出hasptr(const string &s = string())

hasptr hp1 = hp; // 呼叫拷貝建構函式,輸出hasptr(const hasptr &hp)

hasptr hp2; // 呼叫建構函式,輸出hasptr(const string &s = string())

hp2 = hp; // 呼叫拷貝運算子函式,輸出hasptr &operator=

hp1.setps("word"); // 建構函式、拷貝建構函式、拷貝賦值運算子函式都為ps分配了新空間

hp.print(); // 所以hp、hp1、hp2的ps指標指向的空間不一樣,修改乙個的值其他的不變。

hp1.print(); // 輸出word,由setps函式修改

hp2.print(); // 輸出hello,值從hp拷貝過來,空間是新分配的。

// 實參初始化形參要呼叫一次拷貝建構函式,形參初始化返回的臨時變數也要呼叫一次拷貝建構函式,

hp.testcopy(hp1); // 形參和臨時變數在函式結束時時要銷毀,呼叫兩次析構函式。

hp.testcopy1(hp1); // 都是引用初始化,不需要呼叫拷貝建構函式。

hasptr *hp_ptr = new hasptr; // 呼叫建構函式

vectorvec; // 呼叫vector的預設建構函式。

vec.push_back(hp); // 呼叫拷貝建構函式

// 接下來要銷毀hp,hp1,hp2和vector中的hasptr的元素,要呼叫4次析構函式,但是hp_ptr指向的空間不會被銷毀。

// 建構函式,為指標指向分配空間(整個類也只在這個地方分配空間),use初始化為1

hasptr(const string &s = string()):ps(new string(s)), i(0) ,use(new size_t(1)){

cout

hasptr hp("hello"); // 呼叫建構函式,輸出hasptr(const string &s = string())

hasptr hp1 = hp; // 呼叫拷貝建構函式,輸出hasptr(const hasptr &hp)

hasptr hp2; // 呼叫建構函式,輸出hasptr(const string &s = string())

hp2 = hp; // 呼叫拷貝運算子函式,輸出hasptr &operator=

hp1.setps("word"); // 拷貝建構函式、拷貝賦值運算子不為指標ps和use分配新空間

hp.print(); // 所以hp、hp1、hp2的ps指標指向相同的空間,修改乙個的值其他的也變。

hp1.print(); // 輸出word,由setps函式修改

hp2.print(); // 輸出word,由setps函式修改

// 實參初始化形參要呼叫一次拷貝建構函式,形參初始化返回的臨時變數也要呼叫一次拷貝建構函式,

hp.testcopy(hp1); // 形參和臨時變數在函式結束時時要銷毀,呼叫兩次析構函式。

hp.testcopy1(hp1); // 都是引用初始化,不需要呼叫拷貝建構函式。

hasptr *hp_ptr = new hasptr; // 呼叫建構函式

vectorvec; // 呼叫vector的預設建構函式。

vec.push_back(hp); // 呼叫拷貝建構函式

// 接下來要銷毀hp,hp1,hp2和vector中的hasptr的元素,要呼叫4次析構函式,只有最後一次呼叫析構函式才會釋放ps和use指向的空間。

// 但是hp_ptr指向的空間不會被銷毀。

拷貝建構函式 拷貝賦值運算子和析構函式

當定義乙個類時,我們顯式或隱式的指定物件拷貝,移動,複製和銷毀時做什麼。通過5類特殊成員函式來控制這些操作 拷貝建構函式 拷貝複製運算子 移動建構函式 移動複製運算子和析構函式。如果乙個類沒有定義這些,編譯器會自動定義缺失的操作。但對於一些類來說,預設定義可能導致災難。拷貝建構函式定義了當用同型別物...

建構函式,拷貝建構函式,析構函式,賦值運算子過載

1 建構函式 定義 是乙個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內有且只呼叫一次,以保證每個資料成員都有乙個合適的初始值。特性 1 函式名與類名相同。2 沒有返回值。3 有初始化列表 可以不用 4 建構函式可以過載,實參決定了呼叫那個建構函式。5 如果沒...

C 拷貝構造 拷貝複製 析構函式

帶有指標的成員的類必須有拷貝建構函式和拷貝賦值函式,淺拷貝預設的賦值函式會將乙個指標賦值給另乙個,導致進行賦值的物件指標指向的內容記憶體洩漏 string.h ifndef mystring define mystring class string private char m data endif...