什麼是構造函數?¶
想象一下,你買了一臺新電腦,開機時系統會自動初始化一些基本設置(比如加載默認程序、檢查硬件)。在C++中,構造函數就像對象的“開機程序”——當你用類創建一個對象時,構造函數會自動被調用,負責給對象的成員變量賦初始值,完成對象的“初始化”工作。
構造函數的語法規則¶
構造函數是類的特殊成員函數,有以下特點:
1. 函數名與類名完全相同(大小寫敏感)。
2. 沒有返回類型(連void也不行)。
3. 可以帶參數(實現不同方式的初始化)。
4. 默認情況下,對象創建時自動調用。
示例:定義一個簡單的Person類,包含name和age兩個成員變量,用構造函數初始化它們。
#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); // 調用帶參數構造函數
關鍵點:構造函數是“對象的初始化器”,對象創建後,構造函數執行完畢,對象才處於“可用狀態”。
注意事項¶
-
不能被顯式調用:構造函數不能像普通函數一樣用
p1.Person()調用,必須通過對象創建時觸發。 -
默認構造函數的必要性:如果類中定義了帶參數的構造函數,務必手動定義默認構造函數,否則
Person p;會報錯。 -
成員變量初始化方式:構造函數中給成員變量賦值,通常有兩種方式:
- 直接賦值(如name = "Alice";)。
- 使用參數初始化列表(更高效,Person(string n, int a) : name(n), age(a) {})。
總結¶
構造函數是C++中初始化對象的關鍵工具,核心作用是在對象創建時自動爲成員變量賦初始值。掌握以下幾點即可快速上手:
- 構造函數名與類名相同,無返回類型。
- 可以定義多個構造函數(重載),參數不同實現不同初始化方式。
- 默認構造函數在無參數時自動調用,帶參數構造函數需手動調用。
通過簡單例子(如Person類),就能理解構造函數如何讓對象“從無到有”並完成初始化。後續學習中,構造函數還會與繼承、多態等特性結合,但打好基礎是關鍵!