可能重复:
What is the use of making constructor private in a class?
我们在哪里需要私人构造函数?我们如何实例化一个具有私有构造函数的类?
答案 0 :(得分: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)); }
还有许多其他响应也符合为什么私有构造函数在C ++中使用的精神(其中包括Singleton模式)。
你可以做的另一件事是prevent inheritance of your class,因为派生类将无法访问你的类的构造函数。当然,在这种情况下,您仍然需要一个创建类实例的函数。
答案 1 :(得分:29)
一种常见的用法是在单例模式中,您只需要存在一个类的实例。在这种情况下,您可以提供一个static
方法来执行对象的实例化。这样就可以控制实例化特定类的对象数量。
答案 2 :(得分:6)
私有构造函数很有用。要实例化这样的类,需要声明一个静态方法,它执行'new'并返回 指针。
有私人ctors的课程不能放入STL容器,因为他们需要复制ctor。
答案 3 :(得分:5)
如果有其他方法可以生成实例,那么构造函数是私有的是合理的。显而易见的例子是模式Singleton(每个调用返回相同的实例)和Factory(每次调用通常创建新实例)。
答案 4 :(得分:2)
当你想要实现单身时,这很常见。该类可以有一个静态的“工厂方法”,用于检查该类是否已经实例化,如果没有,则调用构造函数。
答案 5 :(得分:1)
例如,您可以在友元类或朋友函数中调用私有构造函数。
Singleton pattern通常使用它来确保没有人创建更多预期类型的实例。
答案 6 :(得分:1)
一个常见用途是模板类型的解决方法类,如下所示:
template <class TObj>
class MyLibrariesSmartPointer
{
MyLibrariesSmartPointer();
public:
typedef smart_ptr<TObj> type;
};
显然,公共的非实现构造函数也可以工作,但是如果有人试图实例化MyLibrariesSmartPointer<SomeType>
而不是MyLibrariesSmartPointer<SomeType>::type
,那么私有构造者会引发编译时错误而不是链接时错误。 desireable。