在 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) {
// 构造函数体
}
};
初始化列表的优势
- 性能优势:对于类类型的成员变量,使用初始化列表可以直接调用其构造函数进行初始化,避免了先默认构造再赋值的额外开销。
- 代码简洁性:可以在一个地方集中对所有需要初始化的成员变量进行初始化,使代码更加清晰易读。