添加成员的声明会导致它隐式初始化?

时间:2014-02-03 07:13:54

标签: c++

我有下一堂课

//ChallengeManager.h:
#include "EntityGenerator.h"

class ChallengeManager
    {
    public:
...
    EntityGenerator _entityGenerator; /* With this declaration, constructor of the EntityGenerator will be callen in the ChallengeManager initialization list. If we will comment this out - clear that wan't be */
    static ChallengeManager* _chManager;
    }


//ChallengeManager.cpp:
    ChallengeManager* ChallengeManager::_chManager;

    ChallengeManager::ChallengeManager() : foo()
    {
        _chManager = this;
        //EntityGenerator _entityGenerator();
    }

    ChallengeManager* ChallengeManager::GetChallangeManager()
    {
        return _chManager;
    }

...

(ChallengeManager是单例,我使用静态方法返回它的引用)。我需要设置 在初始化_entityGenerator之前“_chManager = this”,因为它的构造函数将调用GetChallangeManager()。

我是C ++的新手,无法理解下一件事。当头文件中的“EntityGenerator _entityGenerator”声明没有被注释的EntityGenerator的构造函数隐式调用由c ++运行时调用(我在VS中调试时看到的步骤)在ChallengeManager初始化列表中以及何时被注释 - 未调用。无法理解为什么......因为我知道声明不应该导致C ++中的隐式初始化。你能帮忙吗?

1 个答案:

答案 0 :(得分:3)

这是语言的规则。允许对象获取未初始化的用户定义类型被认为太危险。因此,当实例化包含它们的类型时,用户定义类型的非静态数据成员总是以这种或那种方式初始化。

请注意,初始化不必是隐式的:您可以明确它:

struct Foo
{
  Foo() {}
  Foo(int i, int j) {}
};

struct Bar
{
  Bar() : f_(42, 42) {} // explicit initialization of data member f_
  Foo f_;
};