是否可以使用初始值设定项列表中的其他类成员初始化类成员

Can class member be initialized with another class member in the initializer list?

本文关键字:成员 列表 其他 初始化 可以使 是否      更新时间:2023-10-16

假设我有两个成员的类,

class App
{
public:
   App() : window(1366, 768, "Title"), drawer(window) {}
private:
   Window window;
   Drawer drawer;
}

并且抽屉类具有构造函数Drawer(const Window&)
使用另一个类成员窗口初始化 App 类成员抽屉是否有效,如本例所示?

是的,以下内容有效:

class App
{
public:
   App() : window(1366, 768, "Title"), drawer(window) {}
private:
   Window window;
   Drawer drawer;
};

非静态数据成员按类定义中的声明顺序进行初始化。因此,在这种特定情况下,它的工作原理就像在App定义中drawer之前声明window一样。但是,如果您更改顺序,这将无法按预期工作。

但是编译器会以适当的警告级别警告您。如果顺序颠倒,带有-Wall选项的 GCC 8.2 会发出以下警告。

#1 with x86-64 gcc 8.2
<source>: In constructor 'App::App()':
<source>:16:14: warning: 'App::window' will be initialized after [-Wreorder]
       Window window;
              ^~~~~~
<source>:15:14: warning:   'Drawer App::drawer' [-Wreorder]
       Drawer drawer;
              ^~~~~~
<source>:13:4: warning:   when initialized here [-Wreorder]
    App() : window(1366, 768), drawer(window) {}
    ^~~

由于首先初始化drawer,因此不会使用使用值 1366 和 768 构造的window对象进行初始化。