假设我的班级有两个成员,
class App
{
public:
App() : window(1366, 768, "Title"), drawer(window) {}
private:
Window window;
Drawer drawer;
}
,并且Drawer类具有构造函数Drawer(const Window&)
。
像本例一样,用另一个类成员Window初始化App类成员Drawer是否有效?
答案 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
对象进行初始化。