可以使用初始化器列表中的另一个类成员来初始化类成员吗?

时间:2019-01-28 22:34:43

标签: c++ class c++11 constructor member

假设我的班级有两个成员,

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

,并且Drawer类具有构造函数Drawer(const Window&)
像本例一样,用另一个类成员Window初始化App类成员Drawer是否有效?

2 个答案:

答案 0 :(得分:2)

是,以下内容有效:

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

答案 1 :(得分:1)

非静态数据成员按照类定义中的声明顺序进行初始化。因此,在这种特定情况下,它的工作方式是window的定义中drawer之前声明了App。 但是,如果您更改顺序,则将无法正常工作。

但是编译器会以适当的警告级别警告您。如果顺序相反,则带有-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对象进行初始化。