2015-05-14 35 views
0

以下程序中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

[SSCCE](http://www,sscce.org)。 –

回答

6

每個成員在構造函數開始之前自動初始化;由於您在初始化程序列表中不包含world,因此在此處默認初始化,調用您的構造函數。

然後你創建一個臨時對象分配給它;導致第二個構造函數調用。沒有必要這樣做。

4

你的班級定義說Game有一個World成員,所以創建一個Game實例會自動創建一個World。然後在你的構造函數中第二次分配this->world並創建第二個實例,這是第二個調用。

您可以完全省去構造函數中的行。如果你有,你想傳遞初始化參數World那麼你可以做

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

} 
+0

當你可以直接將'someArg'傳遞給'World :: World'時,爲什麼要調用'World'類的拷貝構造函數? – Downvoter

+0

只是一個錯字,修復。 – loganfsmyth

1

Game構造World也默認構造它的World一員,這就是拳頭。

第二次是在Game::Game:您構建一個臨時對象World並將它分配給World::world用以下代碼。

world = World(); 

你可能想要的是這樣的:

Game::Game() 
{ 
} 

您不需要默認的建設和分配。

+0

你必須快速在這裏看起來:) – Steve

相關問題