在 C++ 中,初始化列表是在構造函數的定義中,用于對類的成員變量進行初始化的一種方式。它緊跟在構造函數的參數列表之后,使用冒號?:
?分隔,各成員變量的初始化用逗號?,
?分隔。下面詳細介紹初始化列表及其參數的含義。
基本語法
class ClassName {
private:Type1 member1;Type2 member2;// 其他成員變量public:// 構造函數ClassName(Param1 param1, Param2 param2) : member1(value1), member2(value2) {// 構造函數體}
};
在上述代碼中,ClassName
?是類名,Param1 param1, Param2 param2
?是構造函數的參數列表,member1(value1), member2(value2)
?就是初始化列表,其中?member1
?和?member2
?是類的成員變量,value1
?和?value2
?是用于初始化這些成員變量的值。
各個參數的含義
1. 成員變量名
成員變量名就是類中定義的變量名,它們會在對象創建時被初始化。例如:
class Point {
private:int x;int y;public:Point(int a, int b) : x(a), y(b) {// 構造函數體}
};
這里的?x
?和?y
?是?Point
?類的成員變量,在初始化列表中使用傳入的參數?a
?和?b
?對它們進行初始化。
2. 初始化值
初始化值是用于初始化成員變量的表達式,可以是常量、變量、函數返回值等。例如:
#include <iostream>class Rectangle {
private:int width;int height;int area;public:Rectangle(int w, int h) : width(w), height(h), area(w * h) {std::cout << "Rectangle created with area: " << area << std::endl;}
};int main() {Rectangle rect(3, 4);return 0;
}
在這個例子中,width
?和?height
?分別用傳入的參數?w
?和?h
?進行初始化,area
?用?w * h
?的計算結果進行初始化。
必須使用初始化列表的情況
1. 常量成員變量
常量成員變量一旦被初始化就不能再被修改,因此必須在初始化列表中進行初始化。
class Example {
private:const int constantValue;public:Example(int value) : constantValue(value) {// 構造函數體}
};
2. 引用成員變量
引用必須在定義時進行初始化,并且之后不能再引用其他對象,所以引用成員變量也必須在初始化
class ReferenceExample {
private:int& ref;public:ReferenceExample(int& value) : ref(value) {// 構造函數體}
};
3. 沒有默認構造函數的類類型成員變量
如果類的成員變量是另一個類的對象,并且該類沒有默認構造函數,那么必須在初始化列表中顯式調用其有參構造函數來初始化該成員變量。
class AnotherClass {
public:AnotherClass(int value) {// 構造函數體}
};class MainClass {
private:AnotherClass obj;public:MainClass(int val) : obj(val) {// 構造函數體}
};
初始化列表的優勢
- 性能優勢:對于類類型的成員變量,使用初始化列表可以直接調用其構造函數進行初始化,避免了先默認構造再賦值的額外開銷。
- 代碼簡潔性:可以在一個地方集中對所有需要初始化的成員變量進行初始化,使代碼更加清晰易讀。