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

C++ 結構體、類、構造函數與拷貝構造函數全面講解

     編輯:關於C++

結構體 vs 類:唯一差別是默認訪問權限

  • struct:默認 public (成員、繼承)。
  • class:默認 private (成員)、private 繼承。
  • 其他功能完全一致:均可含構造/析構、成員函數、繼承、多態。

構造函數:對象初始化的核心

特點

  • 與類同名,無返回類型 (連 void 都無)。
  • 定義對象時自動調用。
  • 可重載:無參、有參、委託構造 (C++11)。

初始化列表 (最佳實踐)

class Student {
    int id;
    string name;
public:
    // 推薦:直接初始化成員,避免默認構造+賦值雙重開銷
    Student(int id, const string& name) : id(id), name(name) {}
    // 傳統寫法 (低效)
    // Student(int id, const string& name) { this->id = id; this->name = name; }
};

拷貝構造函數:深拷貝 vs 淺拷貝

編譯器默認行為:成員級淺拷貝

  • 值類型 (int、double) → 直接複製。
  • 指針/引用/資源句柄 → **僅複製地址**,多個對象共享同一資源 → **雙重釋放/野指針** 風險。

何時必須自定義?

類管理**動態記憶體、文件句柄、Socket、鎖**等獨享資源時 (遵循 **Rule of Three/Five/Zero**)。

正確實現模式 (深拷貝)

class Student {
    char* name; // 動態分配
public:
    Student(const char* n) { name = strdup(n); }
    // 拷貝構造
    Student(const Student& other) : name(strdup(other.name)) {}
    // 拷貝賦值 (Copy-and-swap 惯用法)
    Student& operator=(Student other) { swap(name, other.name); return *this; }
    ~Student() { free(name); }
};

引用:別名機制與參數傳遞

  • 定義:int& ref = a; → ref 是 a 的別名,**不佔用額外存儲**。
  • 必須初始化,不可重新綁定。
  • 函數參數用引用避免拷貝、實現輸出參數、運算符重載。

new/delete 與 RAII

  • new T / new T[N]:分配記憶體並調用構造函數。
  • delete ptr / delete[] arr:調用析構函數並釋放記憶體。
  • 現代 C++ 原則:裸指針不直接管理資源,改用 std::unique_ptr, std::shared_ptr, std::vector, std::string 等 RAII 容器/智能指針。

對象定義的兩種等價語法

Student s1(1001, "Zhang"); // 直接初始化
Student s2 = 1001;         // 複制初始化 (調用 Student(int) 構造,非拷貝構造)
Student s3 = s1;           // 複制初始化 (調用拷貝構造)

總結檢查表

  1. 類有指針/資源成員 → 必寫析構、拷貝構造、拷貝賦值 (或 =delete 禁用拷貝,配合移動語義)。
  2. 構造函數盡量用初始化列表,const/引用成員**必須**在列表初始化。
  3. 傳參/返回值優先 const T&,需修改用 T&,所有權轉移用智能指針按值傳遞。
  4. 理解 struct/class 僅默認可見性不同,按團隊風格統一 (如:POD 用 struct,行為類用 class)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved