首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 類構造函數詳解:類型、調用時機與拷貝語義

     編輯:關於C++

構造函數分類

  1. 默認構造函數:無參數,若未定義任何構造函數,編譯器自動生成(不做任何事)。
  2. 一般構造函數(重載):帶參數,可多個,按參數匹配調用。
  3. 拷貝構造函數:參數為本類 const 引用,用於用現有對象初始化新對象。若未定義,編譯器生成逐成員拷貝(淺拷貝)。涉及指針成員時必須自定義深拷貝。
  4. 類型轉換構造函數:單參數非 explicit 構造函數,隱式轉換類型。
  5. 移動構造函數 (C++11):參數為右值引用,實現資源轉移。

調用時機

  • 對象定義時:`Dog d;`(默認)、`Dog d(1,2);`(一般)、`Dog d = d2;`(拷貝)、`Dog d = 5;`(類型轉換)。
  • 函數傳值參數、返回值(可能觸發拷貝/移動,現代編譯器優化 RVO)。
  • 標準容器插入元素時。

賦值運算符重載

不同於拷貝構造,賦值操作作用於已構造對象。需檢查自賦值,釋放舊資源,深拷貝新資源,返回 `*this` 支持鏈式賦值。

代碼示例

class Dog {
    int* data;
public:
    Dog(int v=0) : data(new int(v)) {}           // 一般/默認
    Dog(const Dog& o) : data(new int(*o.data)) {} // 拷貝構造(深拷貝)
    Dog& operator=(const Dog& o) {                // 賦值運算符
        if (this == &o) return *this;
        delete data;
        data = new int(*o.data);
        return *this;
    }
    ~Dog() { delete data; }
};

總結

理解構造函數類型、拷貝語義(淺/深拷貝)、賦值運算符重載規則,是 C++ 資源管理的基石。C++11 引入移動語義後,更應掌握右值引用與完美轉發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved