C++的初始化列表
C++中的初始化列表(Initializer List)是构造函数用来初始化其类成员的一种语法结构。它允许以更有效的方式初始化类的数据成员,尤其是在初始化引用成员和const成员时,初始化列表成为必要的手段。使用初始化列表时,成员变量是按照它们在类中声明的顺序进行初始化的,而不是它们在初始化列表中出现的顺序。
语法
另一种属性的初始化:初始化列表。
构造函数():属性1(值),属性2(值)…{}
初始化列表位于构造函数参数列表之后,由一个冒号:
引导,后跟一个或多个用逗号,
分隔的初始化项,每个初始化项由成员变量名和括号括起来的初始值组成。如:
class MyClass {
private:
int a;
double b;
public:
MyClass(int x, double y) : a(x), b(y) {
// 构造函数体
}
};
在上述例子中,MyClass
的构造函数使用初始化列表来初始化它的两个成员变量a
和b
。
优势
- 效率: 对于内置类型,使用初始化列表与在构造函数体中赋值的效果相同。但对于对象类型,使用初始化列表可以避免先调用默认构造函数再调用赋值操作符的过程,从而提高效率。
- 必要性: 对于引用类型和const类型的成员变量,必须在初始化列表中进行初始化,因为它们一旦定义就必须被初始化,不能被赋予新值。
- 顺序: 成员变量总是按照它们在类中声明的顺序进行初始化,而不是按照初始化列表中的顺序。这一特性有助于避免依赖特定初始化顺序的编程错误。
使用场景
- 初始化const成员: 因为const成员在定义后就不能被修改,所以必须在类的构造函数的初始化列表中对其进行初始化。
- 初始化引用成员: 引用成员一旦被绑定到一个对象上,就不能被重新绑定,因此也必须在初始化列表中进行初始化。
- 初始化类类型成员: 如果类成员具有没有默认构造函数的类型,或者希望用非默认方式构造这些成员,初始化列表也是必须的。
初始化列表提供了一种更直接、高效的初始化手段,是C++中初始化类成员的推荐方式。
#include <iostream>
using namespace std;
/*
另一种属性的初始化:初始化列表
构造函数():属性1(值),属性2(值)......{}
*/
class Person
{
public:
//构造函数初始化
/*
Person(int a,int b,int c)
{
A = a;
B = b;
C = c;
}
*/
//初始化列表
Person(int a,int b,int c) : A(a),B(b),C(c)
{
}
int A;
int B;
int C;
};
void test()
{
Person p(10,20,30);
cout <<"a = "<<p.A<<endl;
cout <<"b = "<<p.B<<endl;
cout <<"c = "<<p.C<<endl;
}
int main()
{
test();
return 0;
}