在构造函数初始化列表中调用函数是否可以?

nak*_*iya 31 c++ constructor variable-initialization

我的直觉是不是.我遇到以下情况:

class PluginLoader
{
   public:
      Builder* const p_Builder;
      Logger* const p_Logger;

      //Others
};

PluginLoader::PluginLoader(Builder* const pBuilder)
   :p_Builder(pBuilder), p_Logger(pBuilder->GetLogger())
{
   //Stuff
}
Run Code Online (Sandbox Code Playgroud)

或者我应该更改构造函数并Logger* const从构造的位置传递一个PluginLoader?

GMa*_*ckG 35

这完全正常和正常.p_Builder在它之前被初始化了.

  • 更是如此,因为他正在调用`pBuilder-> GetLogger()`,而不是`p_Builder-> GetLogger()`.两者都是合法的,但第二个对在类定义中重新排序的实例变量很敏感. (11认同)
  • @Martin:关闭; 它们按照它们出现在类定义中的顺序进行初始化.初始化列表应该匹配,但严格来说它不必. (8认同)

Ben*_*ley 23

你有什么好.但是,我只是想提醒你注意不要这样做 :( GMan暗示这一点,我只是想说清楚)

class PluginLoader
{
   public:
      Logger* const p_Logger;   // p_Logger is listed first before p_Builder
      Builder* const p_Builder;

      //Others
};

PluginLoader::PluginLoader(Builder* const pBuilder)
   :p_Builder(pBuilder),
    p_Logger(p_Builder->GetLogger())   // Though listed 2nd, it is called first.
                                       // This wouldn't be a problem if pBuilder 
                                       // was used instead of p_Builder
{
   //Stuff
}
Run Code Online (Sandbox Code Playgroud)

请注意,我对您的代码进行了2次更改.首先,在类定义中,我在p_Builder之前声明了p_Logger.其次,我使用成员p_Builder来初始化p_Logger,而不是参数.

这些更改中的任何一个都可以,但是它们一起引入了一个错误,因为p_Logger首先被初始化,并且您使用未初始化的p_Builder来初始化它.

只要记住,成员按照它们在类定义中出现的顺序进行初始化.你把它们放在初始化列表中的顺序是无关紧要的.