跳转到内容

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

已知用途

[编辑 | 编辑源代码]
[编辑 | 编辑源代码]

资源返回

参考文献

[编辑 | 编辑源代码]

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.8

华夏公益教科书