2016-11-08 61 views
1

我一直翻閱SFML藍圖書籍,開始在圖形中弄溼我的腳。我在他們的代碼範例之一注意到他們的遊戲類的構造函數:在「{}」之前在類構造器中使用「:」聲明變量

Game::Game() : _window(sf::VideoMode(800,600), "SFML Title") { 
    code code code... 
} 

_window(SF :::視頻模式(800,600), 「SFML標題」)放在前{},而不是內部。這是不好的做法嗎?這是幹什麼的?我仍然是新來的C++,但我還沒有遇到過這樣的事情。

+2

這是一個很好的做法,它被稱爲[成員初始值列表](http://en.cppreference.com/w/cpp/language/initializer_list) – Danh

回答

2

這是不好的做法?

不,這是很好的做法。如果該成員是const限定類型或引用類型,則它是在構造函數中初始化該成員的唯一方法。

這是幹什麼的?

這就是所謂的member initializer lists

1

這就是所謂的一個成員初始化列表。他們是C++語言的一部分。成員初始化列表允許您在類初始化期間初始化成員。他們的良好做法的一個原因是,他們允許您在分配不起作用時初始化const成員。例如,以下類定義將不起作用,因爲const int member1未使用值進行初始化,也不能將其分配給const int,因爲const使其成爲只讀。

class Game{ 
private: 
    const int member_var; //won't work, needs to be initialized 
    int member_var2; 
public: 
    Game() {} //Game constructor 
}; 

隨着初始化列表,你可以通過你的構造函數定義之後加入一個冒號(但括號之前定義的話)和初始化成員需要初始化const成員一樣,這些和其他變量,無論是直接初始化(使用「()」)或統一初始化(使用「{}」)。要初始化多個成員,請用逗號分隔它們。

class Game{ 
private: 
    const int member_var; 
    int member_var2; 
public: 
    Game(): member_var(1), member_var2(2) {} 
    //Uniform initialization is ": member_var{1}, member_var{2}" 
}; 

在您的例子中,Game()構造函數的類定義(可能是在其他.cpp文件)外通過Game::Game()定義一個成員初始化列表。我猜_window是一個帶有一個構造函數的類,它以sf::VideoMode(800,600)"SFML Title"作爲參數。

相關問題