快速上手C++構造函數:初始化對象的第一步

什麼是構造函數?

想象一下,你買了一臺新電腦,開機時系統會自動初始化一些基本設置(比如加載默認程序、檢查硬件)。在C++中,構造函數就像對象的“開機程序”——當你用類創建一個對象時,構造函數會自動被調用,負責給對象的成員變量賦初始值,完成對象的“初始化”工作。

構造函數的語法規則

構造函數是類的特殊成員函數,有以下特點:
1. 函數名與類名完全相同(大小寫敏感)。
2. 沒有返回類型(連void也不行)。
3. 可以帶參數(實現不同方式的初始化)。
4. 默認情況下,對象創建時自動調用

示例:定義一個簡單的Person類,包含nameage兩個成員變量,用構造函數初始化它們。

#include <string>
using namespace std;

class Person {
public:
    string name;  // 成員變量:姓名
    int age;      // 成員變量:年齡

    // 構造函數:初始化對象
    Person() {  // 默認構造函數(無參數)
        name = "Unknown";  // 給name賦默認值
        age = 0;           // 給age賦默認值
    }

    Person(string n, int a) {  // 帶參數的構造函數(重載)
        name = n;
        age = a;
    }
};

默認構造函數:無參數的初始化

如果類中沒有定義任何構造函數,編譯器會自動生成一個默認構造函數(無參數,且函數體爲空)。但如果我們定義了帶參數的構造函數,編譯器就不會再生成默認構造函數了。

問題:如果只寫了帶參數的構造函數,直接用Person p;(無參數)創建對象會報錯!

解決:手動定義默認構造函數,即使函數體爲空:

class Person {
public:
    string name;
    int age;

    // 手動定義默認構造函數(無參數)
    Person() {
        name = "Unknown";
        age = 0;
    }

    // 帶參數的構造函數(重載)
    Person(string n, int a) {
        name = n;
        age = a;
    }
};

帶參數的構造函數:靈活初始化對象

通過構造函數的重載(參數列表不同),可以讓對象以多種方式初始化:

// 1. 默認初始化(無參數)
Person p1;       // 調用默認構造函數:name="Unknown", age=0

// 2. 帶參數初始化
Person p2("Alice", 20);  // 調用帶參數構造函數:name="Alice", age=20
Person p3("Bob");        // 如果有帶1個參數的構造函數(如 Person(string n)),則會調用

擴展:可以有多個構造函數,參數數量/類型不同即可:

class Person {
public:
    string name;
    int age;

    // 1. 默認構造函數
    Person() {
        name = "Unknown";
        age = 0;
    }

    // 2. 帶1個參數(僅姓名)
    Person(string n) {
        name = n;
        age = 18;  // 年齡默認設爲18
    }

    // 3. 帶2個參數(姓名+年齡)
    Person(string n, int a) {
        name = n;
        age = a;
    }
};

// 使用示例:
Person p4("Charlie");   // name="Charlie", age=18
Person p5("David", 25); // name="David", age=25

構造函數的調用時機

當你用類名創建對象時,構造函數會自動調用,無需手動調用:

// 創建對象時,構造函數被自動觸發
Person p6;   // 調用默認構造函數
Person p7("Eve", 30); // 調用帶參數構造函數

關鍵點:構造函數是“對象的初始化器”,對象創建後,構造函數執行完畢,對象才處於“可用狀態”。

注意事項

  1. 不能被顯式調用:構造函數不能像普通函數一樣用p1.Person()調用,必須通過對象創建時觸發。

  2. 默認構造函數的必要性:如果類中定義了帶參數的構造函數,務必手動定義默認構造函數,否則Person p;會報錯。

  3. 成員變量初始化方式:構造函數中給成員變量賦值,通常有兩種方式:
    - 直接賦值(如name = "Alice";)。
    - 使用參數初始化列表(更高效,Person(string n, int a) : name(n), age(a) {})。

總結

構造函數是C++中初始化對象的關鍵工具,核心作用是在對象創建時自動爲成員變量賦初始值。掌握以下幾點即可快速上手:
- 構造函數名與類名相同,無返回類型。
- 可以定義多個構造函數(重載),參數不同實現不同初始化方式。
- 默認構造函數在無參數時自動調用,帶參數構造函數需手動調用。

通過簡單例子(如Person類),就能理解構造函數如何讓對象“從無到有”並完成初始化。後續學習中,構造函數還會與繼承、多態等特性結合,但打好基礎是關鍵!

小夜