私人建设者

Atu*_*tul 49 c++ private-constructor

可能重复:
在类中创建私有构造函数有什么用?

我们在哪里需要私人构造函数?我们如何实例化一个具有私有构造函数的类?

wkl*_*wkl 64

私有构造函数意味着用户无法直接实例化类.相反,您可以使用Named Constructor Idiom之类的东西创建对象,您可以在其中static创建可以创建和返回类实例的类函数.

Named Constructor Idiom用于更直观地使用类.C++ FAQ中提供的示例适用于可用于表示多个坐标系的类.

这是直接从链接中提取的.它是一个表示不同坐标系中的点的类,但它可以用来表示矩形和极坐标点,因此为了使用户更直观,使用不同的函数来表示返回的坐标系Point.

 #include <cmath>               // To get std::sin() and std::cos()

 class Point {
 public:
   static Point rectangular(float x, float y);      // Rectangular coord's
   static Point polar(float radius, float angle);   // Polar coordinates
   // These static methods are the so-called "named constructors"
   ...
 private:
   Point(float x, float y);     // Rectangular coordinates
   float x_, y_;
 };

 inline Point::Point(float x, float y)
   : x_(x), y_(y) { }

 inline Point Point::rectangular(float x, float y)
 { return Point(x, y); }

 inline Point Point::polar(float radius, float angle)
 { return Point(radius*std::cos(angle), radius*std::sin(angle)); }
Run Code Online (Sandbox Code Playgroud)

还有很多其他的响应也符合为什么私有构造函数在C++中使用的精神(其中包括Singleton模式).

您可以用它做的另一件事是阻止继承您的类,因为派生类将无法访问您的类的构造函数.当然,在这种情况下,您仍然需要一个创建类实例的函数.

  • @Pawel - C++ FAQ示例没有为`Point`定义复制构造函数,因为该类只有原始成员(两个`float`),因此编译器的默认复制构造函数(执行浅复制)就足够了. (3认同)
  • 我只是偶然发现了你的句子“......返回的点代表什么坐标系”。无论使用什么构造函数来创建对象,Point 本身都使用直角坐标(否则恕我直言,这将是一个糟糕的例子)。我查看了常见问题解答,我认为那里的公式也可能具有误导性:“...在任一坐标系中创建点:”。我认为最好说:“通过在任一坐标系中提供坐标作为参数来创建点(具有直角坐标)。我可能听起来很挑剔,但对于新手(像我一样)这样的想法可以有所作为 (2认同)

Nav*_*een 29

一个常见用途是在单例模式中,您只需要存在一个类的实例.在这种情况下,您可以提供一个static方法来执行对象的实例化.这样,可以控制实例化特定类的对象的数量.

  • +1.当我提到单身作为特定成语的案例用法时,我总是被投票.不希望发生在你身上!:) (18认同)

vrd*_*dhn 6

当您不希望用户实例化您的类时,私有构造函数很有用.要实例化这样的类,需要声明一个静态方法,它执行'new'并返回指针.

具有私人ctors的课程不能放入STL容器中,因为它们需要复制ctor.


And*_*rey 5

如果有其他方法可以生成实例,那么将构造函数设为私有是合理的.明显的例子是模式Singleton(每个调用返回相同的实例)和Factory(每个调用通常创建新实例).