目錄
一、初始化和清理
二、拷貝復制
三、取地址重載
四、重要說明
五、注意事項
六、示例代碼
????????在C++中,當一個類沒有顯式定義某些成員函數時,編譯器會自動生成6個默認成員函數。這些函數可以分為以下幾類:
一、初始化和清理
1、構造函數:在對象創建時完成初始化工作
-
如果沒有定義,編譯器生成默認構造函數(無參、函數體為空)
-
對于內置類型不做初始化,自定義類型會調用其默認構造函數
class Date {
public:// 構造函數Date() {// 初始化代碼}
};
2、析構函數:在對象生命周期結束時完成清理工作
-
如果沒有顯式定義,編譯器生成默認析構函數(函數體為空)
-
默認析構函數對內置類型不做處理,對于自定義類型成員,會調用其析構函數
class Date { public:// 析構函數~Date() {// 清理代碼} };
二、拷貝復制
1、拷貝構造函數:使用同類對象初始化創建新對象
-
如果沒有顯式定義,編譯器會生成默認的拷貝構造函數
-
默認生成的拷貝構造函數進行淺拷貝(逐成員拷貝、按字節拷貝)
-
對于指針成員需要自定義實現深拷貝
class Date { public:// 拷貝構造函數Date(const Date& d) {// 拷貝邏輯} };
2、賦值運算符重載:把一個對象賦值給另一個已存在的對象
-
如果沒有顯式定義,編譯器會生成默認的賦值運算符,默認生成的進行淺拷貝
-
需要處理自賦值問題和釋放原有資源
class Date { public:// 賦值運算符重載Date& operator=(const Date& d) {if (this != &d) {// 賦值邏輯}return *this;} };
三、取地址重載
1、普通對象取地址運算符重載:普通對象的取地址操作
-
默認實現返回對象地址
-
極少需要自定義實現
2、const對象取地址運算符重載:const對象的取地址操作
-
默認實現返回對象地址
-
極少需要自定義實現
class Date {
public:// 普通對象取地址Date* operator&() {return this;}// const對象取地址const Date* operator&() const {return this;}
};
-
這兩個運算符通常不需要顯式實現
-
編譯器生成的默認版本就能滿足大多數需求
四、重要說明
-
前4個成員函數(構造、析構、拷貝構造、賦值重載)最為重要,需要重點掌握
-
后2個取地址重載函數在實際開發中很少需要自定義實現
-
C++11新增了移動構造函數和移動賦值運算符,屬于高級特性
-
默認生成的函數行為:
-
對于內置類型不做處理
-
對于自定義類型成員會調用其相應成員函數
-
五、注意事項
-
C++11之后新增了移動構造函數和移動賦值運算符
-
默認生成的函數行為可能不滿足需求(特別是涉及資源管理時),需要顯式實現
-
對于包含指針成員或需要資源管理的類,通常需要自定義拷貝構造函數和賦值運算符
六、示例代碼
class Date {
private:int year;int month;int day;public:// 1. 構造函數Date(int y = 1970, int m = 1, int d = 1) : year(y), month(m), day(d) {}// 2. 析構函數~Date() {}// 3. 拷貝構造函數Date(const Date& other) : year(other.year), month(other.month), day(other.day) {}// 4. 賦值運算符重載Date& operator=(const Date& other) {if (this != &other) {year = other.year;month = other.month;day = other.day;}return *this;}// 5. 取地址運算符重載(通常不需要實現)Date* operator&() { return this; }const Date* operator&() const { return this; }
};