更多 C++ 習慣用法/命名建構函式
外觀
- 以可讀且直觀的方式建立類的物件
- 在建立類的物件時施加某些約束
在 C++ 中,建構函式僅根據引數的型別、順序和數量來區分。當然,當一個類有多個建構函式時,每個建構函式都有不同的目的。但是,在 C++ 中,很難在類的介面中捕獲這種“語義”差異,因為所有建構函式都具有相同的名稱,只有引數可以區分它們。閱讀包含大量建構函式呼叫的程式碼,這些呼叫僅在引數的型別/順序/數量上有所不同,這對於除類原開發人員以外的任何人來說都是很不直觀的。命名建構函式習慣用法解決了這個問題。
命名建構函式習慣用法使用一組具有有意義名稱的靜態成員函式來建立物件,而不是建構函式。建構函式要麼是私有的,要麼是受保護的,客戶端只能訪問公共靜態函式。靜態函式被稱為“命名建構函式”,因為建立物件的每種獨特方式都有一個不同的直觀名稱。考慮以下示例
class Game
{
public:
static Game createSinglePlayerGame() { return Game(0); } // named constructor
static Game createMultiPlayerGame() { return Game(1); } // named constructor
protected:
Game (int game_type);
};
int main(void)
{
Game g1 = Game::createSinglePlayerGame(); // Using named constructor
Game g2 = Game(1); // multiplayer game; without named constructor (does not compile)
}
在上面的類中不使用命名建構函式習慣用法,很難表達Game(1)和Game(0)的含義。這種習慣用法使含義非常清楚!此外,可以使用這種習慣用法對物件建立過程施加某些約束。例如,命名建構函式始終可以使用new動態建立物件。在這種情況下,資源返回習慣用法可能會有所幫助。