C++構造函數和析構函數
??C++的構造函數和析構函數是類的特殊成員函數,用于對象的創建和銷毀,分別在對象的生命周期開始和結束時自動調用。它們的使用對資源管理和對象的初始化/清理至關重要。
1. 構造函數
定義
- 構造函數在對象創建時自動調用,用于初始化對象的數據成員。
- 構造函數的名字與類名相同,沒有返回值。
特點
- 無返回值(即使寫
void
也會報錯)。 - 可以重載:支持多個構造函數,通過參數列表區分。
- 默認構造函數:如果沒有定義構造函數,編譯器會生成一個默認構造函數。
- 隱式調用與顯式調用:構造函數可以通過隱式或顯式方式調用。
語法
class MyClass {
public:MyClass() { // 默認構造函數std::cout << "Default Constructor called!" << std::endl;}MyClass(int x) { // 參數化構造函數std::cout << "Parameterized Constructor called with value " << x << std::endl;}
};int main() {MyClass obj1; // 調用默認構造函數MyClass obj2(10); // 調用參數化構造函數MyClass obj3 = MyClass(20); // 顯式調用構造函數return 0;
}
類型
- 默認構造函數
- 無參數或所有參數都有默認值。
MyClass() {}
- 參數化構造函數
- 帶參數,用于靈活初始化對象。
MyClass(int x, int y) {}
- 拷貝構造函數
- 通過同類型對象初始化新對象,參數是同類的引用。
MyClass(const MyClass& obj) {}
- 移動構造函數
- 用右值引用初始化對象,提升性能。
MyClass(MyClass&& obj) noexcept {}
- 委托構造函數(C++11)
- 一個構造函數調用另一個構造函數。
MyClass() : MyClass(0) {}
初始化列表
??構造函數使用初始化列表可以高效地初始化數據成員,特別是常量、引用類型或需要自定義構造的成員。
- 成員變量的初始化順序與它們在類中聲明的順序一致,而不是在初始化列表中出現的順序。即使在初始化列表中以不同順序指定初始化,成員變量的初始化仍按照它們在類中的聲明順序進行。
const
成員變量必須在對象構造時初始化,因為它們一旦初始化后就不能被修改。由于這種特性,const
成員變量的初始化只能通過構造函數的初始化列表
實現,不能在構造函數體內賦值。
class