0%

C++构造函数初始化列表

语法

在构造函数的()之后,冒号开头,逗号分隔,括号传参,这一段就是初始化列表,随后是在{}里写构造函数内容。

1
2
3
4
Example(argv):a(1),b(2) 
{
···
}

初始化作用

无法赋值的成员,必须使用初始化列表进行初始化

例如假设有个类成员,它本身是个没有默认构造函数的类。

1
2
3
4
5
class CMember
{
public:
CMember(int x){···}
}

我们都知道此时CMember* pm=new CMember;是错误的,必须调用有参数的构造函数。

此时 CMember 是另一个类的成员时,我们怎么初始化呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

class CMyClass {
CMember m_member;

public:

CMyClass();

};

//必须使用成员初始化列表
CMyClass::CMyClass() : m_member(2)
{
...
}

因为 m_member 不存在默认构造函数,所以不能在构造函数里 默认初始化后再对其赋值,只能使用初始化列表的方式

常量对象和引用对象也是一样,只能被初始化。

效率相关

和上例类似,假如 CMember 存在默认构造函数呢?那我们是可以在 CMyClass 函数体内对其赋值的。

但是此时编译过程是————先调用 CMember 的默认构造函数,再调用拷贝构造函数,即需两次函数运算。

而假如是初始化列表,则直接调用相应的带参数的构造函数。