C++11引入了类内初始化
对类成员的初始化方式有
1. 构造函数初始化 (C++11以前)
2. 初始化列表 (C++11以前)
3. 类内初始化成员变量,允许在定义类的时候,在类内直接对非静态成员,静态成员常量利用进行初始化(静态变量 ---不可以在类内初始化)。
类内初始化是在定义类成员变量的时候直接对其赋值,赋值的方式可以使用等号赋值,也可以使用大括号赋值。
#include <iostream>
class MyClass {
public:
MyClass() {
m_myInt = 1; //构造函数初始化
}
MyClass(int num) : m_myInt(num), m_myDouble(3.14) { //初始化列表
}
private:
// 在类定义中初始化类成员变量
int m_myInt = 10;
double m_myDouble { 2.1 };
const int m_myConstInt = 10; //const 成员变量
const static int m_myConstStaticInt = 20; //const static 成员变量
};
int main() {
return 0;
}
编译器对应的实现如下 参考网址 C++ Insights
class MyClass
{
public:
inline MyClass()
: m_myInt{10}
, m_myDouble{2.1000000000000001}
, m_myConstInt{10}
{
this->m_myInt = 1;
}
inline MyClass(int num)
: m_myInt{num}
, m_myDouble{3.1400000000000001}
, m_myConstInt{10}
{
}
private:
int m_myInt;
double m_myDouble;
const int m_myConstInt;
static const int m_myConstStaticInt = 20;
};
可以发现编译器会把类内初始化的成员变量自动转换为初始化列表,在多个构造函数时,可以极大简化代码
初始化的顺序是先类内初始化,再初始化列表,最后构造函数初始化。