51

可能重复:
在类中将构造函数设为私有有什么用?

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

4

7 回答 7

69

私有构造函数意味着用户不能直接实例化一个类。相反,您可以使用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)); }

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

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

于 2011-01-10T15:52:37.947 回答
29

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

于 2011-01-10T15:51:26.610 回答
6

当您不希望您的类被用户实例化时,私有构造函数很有用。要实例化此类类,您需要声明一个静态方法,该方法执行“new”并返回指针。

不能将具有私有 ctor 的类放入 STL 容器中,因为它们需要复制 ctor。

于 2011-01-10T15:53:54.877 回答
5

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

于 2011-01-10T15:52:03.143 回答
2

当您想要实现单例时,这很常见。该类可以有一个静态的“工厂方法”来检查该类是否已经被实例化,如果没有,则调用构造函数。

于 2011-01-10T15:51:49.933 回答
1

例如,您可以在友元类或友元函数中调用私有构造函数。

单例模式通常使用它来确保没有人创建更多预期类型的​​实例。

于 2011-01-10T15:52:32.003 回答
1

一种常见用途是模板类型定义解决方法类,如下所示:

template <class TObj>
class MyLibrariesSmartPointer
{
  MyLibrariesSmartPointer();
  public:
    typedef smart_ptr<TObj> type;
};

显然,公共的未实现的构造函数也可以工作,但是如果有人试图实例MyLibrariesSmartPointer<SomeType>化而不是 ,私有构造函数会引发编译时错误而不是链接时错误MyLibrariesSmartPointer<SomeType>::type,这是可取的。

于 2011-01-10T15:56:47.500 回答