初始化成员列表

在cpp中我们经常创造一些类的使用,在初始化时过多的变量会导致代码冗乱和可读性下降,在一些特定语句使用时还会带来一系列的程序安全隐患和意想不到的bug。初始化成员列表在class的成员初始化中具有相当好用,可读性强,便捷的优点。

初始化成员列表的语法如下:

1
2
3
4
5
析构函数名()
:成员1(成员1初始量),成员2(成员2初识量),.....
{
代码块
}

需要注意的是在初始化成员列表时,初始化的成员顺序,必须按照类中成员的声明顺序进行,否则会报错。

以下为实例:

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

class A
{
private:
int a;
int b;
public:
A()
:a(10),b(20)
{
代码块
}
};

而在一些特定情况下初始化成员列表可以避免一些额外的性能消耗的一些bug发生

例子如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
class Num
{
public:
Num()
{
std::cout << "this is Num class" << std::endl;
}
Num(int x)
{
std::cout << "cout "<< x << std::endl;
}
};

class A
{
private:
int a;
std::string s_name;
Num m_num;
public:
A()
:a(10),s_name("A")
{
//s_name="A";//这里赋值时会有=额外的开销,在此处真正的赋值过程为s_name=std::string("A"),相当于再次创建了一个string性能消耗会增加。
m_num=Num(1);//此处我们想构建的m_num实行第二种构造函数的内容
}
};

int main()
{
A a;
}

此时输出结果如下:

image-20240917173920333

即上述过程中两个构造函数均被实现了一次即有两次的实例对象创建。而当我们换用初始化成员列表后如下:

1
2
3
4
5
6
7
8
9
10
11
12
class A
{
private:
int a;
std::string s_name;
Num m_num;
public:
A()
:a(10),s_name("A"),m_num(Num(1))
{
}
};

此时的运行结果如下:

image-20240917174321789

即我们只得到了使用带有传入参数的构造函数的实例的创建。


资料参考

YouTube上Thecherno的cpp系列