私人构造函数

可能重复:
什么是在一个类中使构造函数是私人的使用?

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

私有构造器意味着用户不能直接实例化一个类。 相反,你可以使用像Named Constructor Idiom这样的东西来创build对象,你可以在这里创build和返回一个类的实例。

命名构造函数习语是为了更直观地使用一个类。 在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 ++中使用私有构造函数的精神(其中单例模式)。

你可以做的另一件事是阻止你的类inheritance ,因为派生类将无法访问你的类的构造函数。 当然,在这种情况下,你仍然需要一个创build类的实例的函数。

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

私人构造函数是非常有用的,当你不希望你的类被用户实例化。 要实例化这样的类,你需要声明一个静态方法,它执行“new”并返回指针。

有私人课程的学生不能放在STL容器中,因为他们需要一个复制课程。

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

当你想实现一个单身人士是很常见的。 这个类可以有一个静态的“工厂方法”来检查类是否已经实例化,如果没有,就调用构造方法。

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

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

一个常见的用途是template-typedef解决方法类,如下所示:

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

显然公共未实现的构造函数也可以工作,但是如果有人试图安装MyLibrariesSmartPointer<SomeType>而不是MyLibrariesSmartPointer<SomeType>::type ,这是一个私人的构造函数会产生编译时错误,而不是链接时间错误。

Interesting Posts