C++ 中的初始化方式有下面几种:

  • 拷贝初始化:通过 = 赋值的形式初始化,是最基础的方式,底层会调用拷贝构造函数(或移动构造)。
  • 直接初始化:通过括号 () 直接传递初始化参数,直接调用构造函数,比如 int a(10);double b(3.14);
  • 列表初始化:通过花括号{}初始化,是 C++11 推荐的通用方式,能避免 “最令人头痛的解析” 问题。比如 int a{10};int b = {20};

初始化列表

  • 成员类的初始化:如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数。
  • Const 成员的初始化:当类成员中含有一个 Const 对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。

使用场景

对父类进行初始化

调用格式为“子类构造函数 : 父类构造函数”,如下,其中 QMainWindowMyWindow 的父类:

MyWindow::MyWindow(QWidget* parent , Qt::WindowFlags flag) : QMainWindow(parent,flag)

对类成员进行初始化

调用格式为“构造函数 : A(初始值),B(初始值),C(初始值)……”,如下,其中 A、B、C 分别是类的成员变量:


class rectangle //头文件中类定义
{
public:
    rectangle( int pointX, int pointY, int Width, int Length );
private:
    CPoint m_point;
    int m_Width;
    int m_Length;
};
 
rectangle::rectangle(int pointX, int pointY, int Width, int Length) : m_point(pointX,pointY),m_Width(Width),m_Length(Length)//源文件中构造函数实现
{
    todo......
}

对类的 const 成员变量进行初始化

由于 Const 成员变量的值无法在构造函数内部初始化,因此只能在变量定义时赋值或使用初始化列表赋值。

注意

  • 构造函数列表初始化执行顺序与成员变量在类中声明顺序相同,与初始化列表中语句书写先后无关。
  • 相对于在构造函数中赋值,初始化列表执行效率更高。