为什么构造函数在我的程序中调用了两次?

时间:2015-05-14 15:04:55

标签: c++

以下程序中World对象的构造函数被调用两次。

头文件:

#ifndef GAME_H
#define GAME_H
#include "World.h"

class Game
{
    public:
        Game();
    private:
        World world;
};

cpp文件: -

#include "Game.h"

Game::Game()
{
    world = World();
}

世界级的头文件: -

#ifndef WORLD_H
#define WORLD_H

class World
{
    public:
        World();
};
#endif // WORLD_H

世界级的cpp文件: -

#include "World.h"
#include <iostream>

using namespace std;

World::World()
{
    cout<<"i am going to print twice"<<endl;
}

3 个答案:

答案 0 :(得分:6)

每个成员在构造函数开始之前自动初始化;由于您没有在初始化列表中包含world,因此在此时默认初始化,调用构造函数。

然后创建一个临时对象来分配给它;导致第二个构造函数调用。没有必要这样做。

答案 1 :(得分:4)

您的班级定义说GameWorld成员,因此创建游戏实例会自动创建一个世界。然后在你的构造函数中,你第二次分配this->world并创建第二个实例,这是第二次调用。

您可以完全忽略构造函数中的行。如果您希望传递参数以初始化World,那么您可以执行

Game::Game(someArg) : world(someArg){

}

答案 2 :(得分:1)

构建Game时,World也是默认构建的,因为它是World的成员,这是第一个。

第二次是在Game::Game:您构建一个临时World对象,并使用以下代码将其分配给World::world

world = World();

你可能想要的是:

Game::Game()
{
}

您不需要默认构造和分配。