c++ - 基类和派生类中类成员变量的初始化

标签 c++ c++11

假设我们有一个 Base 类和一个 Derived 类:

class Base {

  public:

    Base(int x) : var1(x)

    int process(){
       //return some function of var1
    }

  protected:
    int var1;

}

class Derived : public Base {

  Derived(int init) : Base(init), a(process()), b(process()) {}

  protected:

    int a;
    int b;


}

换句话说,当我们初始化Derived时,我们假设首先调用Base构造函数,它初始化var1中的成员变量具有 init 值的基类,然后使用 process() 初始化 ab 成员变量> 函数,这取决于设置为 var1 的值。

请注意,为了使此代码正确,我们需要确保 Base(init)a(process())b(过程()).

在 C++ 中假设上述初始化顺序将保持不变是否有效?或者我是否需要将 Derived 构造函数更改为以下内容以保证初始化顺序?

Derived(int init) : Base(init) {

  a = process();
  b = process();
}

最佳答案

顺序是有保证的,你什么都不用做。基在成员之前初始化(按照它们声明的顺序)。成员按照声明的顺序初始化 [class.base.init]/13 (注意:声明的顺序,不是 mem-initializers 在构造函数的初始化列表中出现的顺序!)。

您还可以依赖于以与初始化顺序完全相反的顺序销毁基础和成员......

关于c++ - 基类和派生类中类成员变量的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55624077/

相关文章:

c++ - 完美转发可变参数模板到标准线程

C++11 'native_handle' 不是 'std::this_thread' 的成员

c++ - 从 const 对象访问非常量方法

c++ - 同样的表达方式却不同的结果

c++ - 获取 vector c++中的字符串计数

c++ - 在双向链表中使用指针交换节点

c++ - GLSL - 从阴影立方体贴图检索值时的结果不正确

c++ - 存储在结构中的元素是否彼此相邻

algorithm - gcc 4.9 中的 std::rotate 返回值

c++ - 为什么这些代码仍然使用左值函数?