以下程序中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;
}
答案 0 :(得分:6)
每个成员在构造函数开始之前自动初始化;由于您没有在初始化列表中包含world
,因此在此时默认初始化,调用构造函数。
然后创建一个临时对象来分配给它;导致第二个构造函数调用。没有必要这样做。
答案 1 :(得分:4)
您的班级定义说Game
有World
成员,因此创建游戏实例会自动创建一个世界。然后在你的构造函数中,你第二次分配this->world
并创建第二个实例,这是第二次调用。
您可以完全忽略构造函数中的行。如果您希望传递参数以初始化World
,那么您可以执行
Game::Game(someArg) : world(someArg){
}
答案 2 :(得分:1)
构建Game
时,World
也是默认构建的,因为它是World
的成员,这是第一个。
第二次是在Game::Game
:您构建一个临时World
对象,并使用以下代码将其分配给World::world
。
world = World();
你可能想要的是:
Game::Game()
{
}
您不需要默认构造和分配。