析構函式 賦值操作符與複製建構函式關係的分析

2021-06-01 17:36:55 字數 1679 閱讀 7194

類設計三法則:如果類需要顯式定義析構函式,則它也需要賦值操作符和複製建構函式

關於這個法則需要注意兩點:

1.如果類成員變數中有指向動態分配的記憶體,則一定需要顯式定義析構函式,從而需要定義賦值操作符和複製建構函式 2.

如果乙個類需要提供顯式的複製和賦值操作定義,則將這個類的物件作為資料成員的類不需要額外提供複製和賦值操作定義,也就是說乙個類預設的複製和賦值操作遞迴的依賴於底層類的成員的複製和賦值,那個類也不需要析構函式,下面是乙個能證明這個說法的例子:

#include #include using namespace std;

//不能對b使用memcpy函式的原因是顯而易見的

class b

b(const b& b)

b& operator=(const b& b)

return *this;

} ~b() };

//a不需要定義複製建構函式、賦值操作符、析構操作符,但也不能對a使用mencpy函式

class a

};void main()

{ a a1(1,1);

a a2(2,2);

cout << "測試a是否需要賦值操作符" << endl;

cout << "a1: " << a1.b1.a << " " << *(a1.b1.a) << " " << a1.b2.a << " " << *(a1.b2.a) << endl;

cout << "a2: " << a2.b1.a << " " << *(a2.b1.a) << " " << a2.b2.a << " " << *(a2.b2.a) <

執行結果:

b的建構函式

b的建構函式

b的建構函式

b的建構函式

測試a是否需要賦值操作符

a1: 00036208 1 00036238 1

a2: 00036268 2 00036298 2

呼叫b的賦值操作符

呼叫b的賦值操作符

a1: 00036208 2 00036238 2

a2: 00036268 2 00036298 2

測試a是否複製建構函式

b的建構函式

b的建構函式

a3: 00036340 1 00036370 0

b的複製建構函式

b的複製建構函式

a4: 000363a0 1 000363d0 0

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

呼叫b的析構函式

總結:

1.如果類有指向動態記憶體的指標,則這個類需要定義賦值操作符、複製建構函式、析構函式

2.如果類沒有直接指向動態記憶體的指標,但類具有的一些類成員變數需要定義

賦值操作符、複製建構函式和析構函式,則這個類不需要定義賦值操作符、複製建構函式與析構函式

注:預設的賦值操作符和複製建構函式遞迴的依賴於底層類成員的複製和賦值的定義,它不僅僅像c版本的結構體那樣僅實施按位複製,它只向內建型別成員變數實施按位複製,預設的析構函式也遞迴的依賴於底層類的析構函式

複製控制 複製建構函式 賦值操作符 析構函式

複製建構函式 copy constructor 具有單個形參,該形參是對該類型別的引用 常用const修飾 用於 a.根據另乙個同型別的物件顯式或隱式初始化乙個物件。b.複製乙個物件,將它作為實參傳給乙個函式。c.從函式返回時複製乙個物件。d.初始化順序容器中的元素。e.根據元素初始化式列表初始化陣...

建構函式 複製建構函式 析構函式 賦值操作符的總結

建構函式 複製構 造函式 析構函式 賦值操作符這幾個概念是c 中乙個類裡面的幾個基本函式,作為初學者的我對這幾個概念比較生疏,對其用法也有些疑問,下面對這幾個基本的函式進行總結。這裡主要說明他們的含義以及何時需要使用者自己定義 和預設的有啥區別 建構函式 建構函式是特殊的成員函式,只要建立類型別的新...

複製建構函式與賦值操作符

乙個類裡是否需要複製建構函式?有時候答案是 是 如果你的類在建構函式裡分配了資源,則可能需要乙個顯式的複製建構函式來管理資源。有析構函式的類通常用析構函式來釋放建構函式分配的資源,這通常也說明需要乙個複製建構函式。如果需要複製建構函式,則多半需要乙個賦值操作符。類x的賦值由x operator 來定...