前言
在 C++ 面向对象编程体系中,类是封装数据与行为的核心单元。实际开发中常需面对具有特殊约束的场景:例如防止对象拷贝以规避资源重复释放风险,限定对象创建位置(仅堆或仅栈)以规范内存管理,禁止类被继承以保障核心逻辑不被篡改,或是确保类仅存在一个实例以实现全局资源统一调度。
本文系统拆解五种典型特殊类的实现逻辑与技术细节,结合 C++ 语言特性提供完整代码示例,并分析方案的优缺点与适用场景。
设计一个不能被拷贝的类
只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
- C++98 方法:将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有。
- C++11 方法:用
delete禁止生成拷贝构造函数和赋值运算符重载的默认成员函数。
设计一个只能在堆上创建对象的类
方法:让这个类不能被拷贝并且构造函数设置成私有的,然后再提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。
class HeapOnly {
public:
static HeapOnly* CreateObj() {
return new HeapOnly;
}
private:
HeapOnly() {}
HeapOnly(const HeapOnly& hp) = delete;
HeapOnly& operator=(const HeapOnly& hp) = delete;
};
设计一个只能在栈上创建对象的类
方法:先把构造函数私有化并且禁用 operator new,然后再搞个静态成员函数去构造对象。
引申:关于这里的
operator new,这个的话默认调用的是全局new,这类里面这样搞了之后这个类就用不了new了。
class StackOnly {
public:
static StackOnly CreateObj() {
StackOnly st;
return st;
}
private:
StackOnly() {}
void* operator new( size) = ;
};


