在C++中,如果一个类的构造函数被声明为private,那么直接在该类外部创建该类型的对象(包括栈对象和堆对象)是不允许的,因为外部代码无法访问私有构造函数。
但仍有几种特殊情况可以间接创建该类的实例:
1、直接创建对象(不允许)
2、允许创建对象的特殊情况
a)、类内部成员函数可以创建对象。类的成员函数(包括静态成员函数)可以访问私有构造函数
b)、友元(friend)函数可以创建对象。被声明为friend的函数或类可以访问私有构造函数。
c)、嵌套类可以访问私有构造函数。如果另一个类是当前类的嵌套类(定义在类内部的类),它可以访问私有构造函数。
3、设计模式中的应用
- 单例模式(Singleton):通过私有构造函数+静态方法控制唯一实例。
class Singleton {
private:
Singleton() {} // 私有构造函数
public:
static Singleton& getInstance() { // 静态方法返回唯一实例
static Singleton instance; // 局部静态变量(线程安全,C++11 起)
return instance;
}
// 删除拷贝构造函数和赋值运算符,防止复制
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
int main() {
Singleton& obj = Singleton::getInstance(); // 获取唯一实例
return 0;
}
- 工厂模式(Factory Pattern):通过私有构造函数+工厂方法控制对象创建。
class Product {
private:
Product() {} // 私有构造函数
public:
static Product create() { // 工厂方法
return Product();
}
};
int main() {
Product p = Product::create(); // 通过工厂方法创建对象
return 0;
}
私有构造函数的主要目的是限制对象的创建方式,强制使用特定的方法(如工厂方法或单例模式)来创建对象。这是一种常见的封装技术,用于实现不可复制类、单例模式或对象池等设计。