对象构造/初始化的顺序

时间:2014-05-04 10:11:05

标签: c++ constructor static-initialization

将以何种顺序召集ctors?

template<class T>
class A {
    public:
        static std::function<void(void)> funcobj;
};

template<class T>
std::function<void(void)> A<T>::funcobj = [](){};

class B : public A<B> {
    public:
        static const int i;

        B::B()
        { 
            DoSomethingHere(); 
        };
}inst;

std::function<void(void)> B::funcobj = [](){};

const int B::i = 2;

我是对的,订单会是这样的吗?   - const int B :: i - &gt;应该在PE文件的数据部分硬编码,因此根本不需要构建?
  - 用于初始化A&lt; std :: function的ctor。 B&gt; :: funcobj
  - A的人   - 用于初始化B :: funcobj的std :: function的ctor(虽然A&lt; B&gt; :: funcobj和B :: funcobj在技术上应该相同)
  - ctor B :: B

1 个答案:

答案 0 :(得分:1)

首先,静态声明将按顺序执行。所以:

template<class T> std::function<void(void)> A<T>::funcobj = [](){};
std::function<void(void)> B::funcobj = [](){};

const int B::i = 2;

(如果 B :: i 是一个对象类型而不是 int 那么它的构造函数就会被调用)

然后,当初始化变量 inst 时,它将通过初始化父类开始,即模板类A 的构造函数将被调用。

最后将调用 B类的构造函数。

相关问题