更多 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动态创建对象。在这种情况下,资源返回习惯用法可能会有所帮助。