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

C++ 構造函數重載:多種初始化方式的實作與預設構造函數陷阱

     編輯:C++ 入門

什麼是構造函數重載?

同一個類別可以定義多個參數列表不同的構造函數,稱為構造函數重載。這讓物件建立時能依據提供的引數選擇不同的初始化邏輯。

範例:Rectangle 類別的多種構造函數

#include <iostream>
using namespace std;

class Rectangle {
    int width, height;
public:
    Rectangle();           // 預設構造函數
    Rectangle(int a, int b); // 參數化構造函數
    int area() { return width * height; }
};

Rectangle::Rectangle() {
    width = 5;
    height = 5;
}

Rectangle::Rectangle(int a, int b) {
    width = a;
    height = b;
}

int main() {
    Rectangle rect(3, 4);  // 呼叫 Rectangle(int, int)
    Rectangle rectb;       // 呼叫 Rectangle()
    cout << "rect area: " << rect.area() << endl;
    cout << "rectb area: " << rectb.area() << endl;
    return 0;
}

預設構造函數的特殊地位

  • 若類別未定義任何構造函數,編譯器會隱式產生一個預設構造函數(無參數、不做任何初始化)。
  • 一旦自行定義了任何構造函數(即使只有帶參數的),編譯器不再自動產生預設構造函數。
  • 此時若仍需無參數建立物件(如 Rectangle rectb;),必須顯式定義預設構造函數,否則編譯錯誤。

最佳實務建議

  1. 永遠提供預設構造函數(可使用 = default 讓編譯器生成),除非刻意禁止無參數建構。
  2. 使用成員初始化列表而非函數主體賦值,提升效率並支援 const/參考成員。
  3. 考慮使用 explicit 關鍵字避免單參數構造函數被隱式轉換使用。

C++11 委派構造函數

可在一個構造函數中呼叫另一個,減少重複程式碼:

class Rectangle {
    int width, height;
public:
    Rectangle() : Rectangle(5, 5) {} // 委派給雙參數版本
    Rectangle(int a, int b) : width(a), height(b) {}
    // ...
};
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved