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

C++ 为什么在我的程序中调用了两次构造函数?,c++,C++,以下程序中世界对象的构造函数被调用两次 头文件: #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 #def

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

头文件:

#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;
}
#包括“World.h”
#包括
使用名称空间std;
世界::世界()
{

cout你的类定义说
Game
有一个
World
成员,因此创建一个游戏实例将自动创建一个世界。然后在你的构造函数中,你第二次分配
this->World
并创建第二个实例,这就是第二次调用

您可以在构造函数中完全省去这一行。如果您希望传递参数来初始化
World
,那么您可以这样做

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

}

当构建
游戏
时,
世界
也是默认构建的,因为它是
世界
的成员,这是第一个

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

world = World();
您可能想要的是:

Game::Game()
{
}

您不需要默认的构造和赋值。

在构造函数开始之前,每个成员都会自动初始化;因为您在初始化器列表中不包括
world
,所以默认在该点初始化,调用您的构造函数


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

请。您必须在这里快速操作:)当您可以直接将
someArg
传递到
World::World
时,为什么要调用类
World
的复制构造函数?