我们什么时候需要C++中的私有构造函数
When do we need a private constructor in C++?
我有一个关于C++中私有构造函数的问题。如果构造函数是私有的,我如何创建类的实例?
我们应该在类中有一个getInstance((方法吗?
有几个private
构造函数的场景:
-
限制除
friend
以外的所有对象的创建;在这种情况下,所有构造函数都必须是private
class A { private: A () {} public: // other accessible methods friend class B; }; class B { public: A* Create_A () { return new A; } // creation rights only with `B` };
-
限制特定类型的构造函数(即复制构造函数、默认构造函数(。例如
std::fstream
不允许通过这种不可访问的构造函数进行复制class A { public: A(); A(int); private: A(const A&); // C++03: Even `friend`s can't use this A(const A&) = delete; // C++11: making `private` doesn't matter };
-
有一个通用的委托构造函数,它不应该暴露在外部世界:
class A { private: int x_; A (const int x) : x_(x) {} // common delegate; but within limits of `A` public: A (const B& b) : A(b.x_) {} A (const C& c) : A(c.foo()) {} };
-
对于单例模式,当单例
class
不可继承时(如果它是可继承的,则使用protected
构造函数(class Singleton { public: static Singleton& getInstance() { Singleton object; // lazy initialization or use `new` & null-check return object; } private: Singleton() {} // make `protected` for further inheritance Singleton(const Singleton&); // inaccessible Singleton& operator=(const Singleton&); // inaccessible };
私有构造函数通常与Builder方法一起使用,例如在命名构造函数习惯用法中。
class Point
{
public:
static Point Polar(double, double);
static Point Cartesian(double, double);
private:
Point(double,double);
};
在这个(典型的(示例中,命名构造函数习惯用法用于明确地确定使用哪个坐标系来构建Point
对象。
让我们试试代码:
#include <iostream>
using namespace std;
class aTestClass
{
aTestClass() ////////// Private constructor of this class
{
cout << "Object createdn";
}
public:
};
int main()
{
aTestClass a;
aTestClass *anObject;
}
aTestClass a行导致错误,因为该行正在间接尝试访问私有构造函数。注释掉这一行并运行程序。它运行得非常好。现在的问题是如何在这种情况下创建对象。让我们再写一个程序。
#include <iostream>
using namespace std;
class aTestClass
{
aTestClass() ////////// Private constructor of this class
{
cout << "Object createdn";
}
public:
aTestClass* getAnObject() ///// A public method create an object of this class and return the address of an object of that class
{
return (new aTestClass);
}
};
int main()
{
//aTestClass a;
aTestClass *anObject = NULL;
anObject = anObject->getAnObject();
}
输出为
Object created
因此,我们创建了一个包含私有构造函数的类的对象。
使用此概念来实现单例类
是的,这通常用于通过静态成员函数访问对象的Singleton模式。
如果某个构造函数是私有的,这意味着除了类本身(和朋友(之外,任何人都不能使用该构造函数创建它的实例。因此,您可以提供像getInstance((这样的静态方法来创建类的实例,或者在一些朋友类/方法中创建实例。
这取决于构造函数最初被设置为私有的原因(您应该询问编写您正在编辑的类的人(。有时,构造函数可能被设置为私有,以禁止复制构造(同时允许通过其他构造函数进行构造(。其他时候,构造函数可能被设置为私有的,以禁止创建类,除非是由类的"朋友"创建(如果类是一个"助手",则通常会这样做,该"助手"只能由创建助手类的类使用(。构造函数也可以是私有的,以强制使用(通常是静态的(创建函数。
如果创建私有构造函数,则需要在类中创建对象
#include<iostream>
//factory method
using namespace std;
class Test
{
private:
Test(){
cout<<"Object created"<<endl;
}
public:
static Test* m1(){
Test *t = new Test();
return t;
}
void m2(){
cout<<"m2-Test"<<endl;
}
};
int main(){
Test *t = Test::m1();
t->m2();
return 0;
}
C++中的私有构造函数可用于限制常量结构的对象创建。您可以在相同的范围内定义类似的常量,如enum:
struct MathConst{
static const uint8 ANG_180 = 180;
static const uint8 ANG_90 = 90;
private:
MathConst(); // Restricting object creation
};
像MathConst::ANG_180
一样访问它。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为