引言
在 C++ 面向对象编程体系中,类是封装数据与行为的核心单元。除了常规业务逻辑,实际开发中常需面对具有特殊约束的场景:例如防止对象拷贝以规避资源重复释放风险,限定对象创建位置(仅堆或仅栈)以规范内存管理,禁止类被继承以保障核心逻辑不被篡改,或是确保类仅存在一个实例以实现全局资源统一调度。这些需求的实现,正是特殊类设计的核心范畴。
本文聚焦特殊类设计,系统拆解五种典型场景的实现逻辑与技术细节。从拷贝构造函数的管控,到构造函数与内存分配接口的限制;从基于 final 关键字的继承禁止,到单例模式的饿汉与懒汉策略对比。每类设计均结合 C++ 语言特性,提供完整代码示例,并深入分析方案的优缺点与适用场景。
设计一个不能被拷贝的类
只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
C++98 方法: 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有。
C++11 方法: 用 delete 禁止生成拷贝构造函数和赋值运算符重载的默认成员函数。
class NoCopy {
public:
// C++11 方式推荐
NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
};
设计一个只能在堆上创建对象的类
要让类只能在堆上创建,需要满足两个条件:首先让类不能被拷贝,其次将构造函数设为私有,然后提供一个静态成员函数来负责堆上的对象创建。
class HeapOnly {
public:
static HeapOnly* CreateObj() {
return new HeapOnly();
}
private:
HeapOnly() {}
HeapOnly(const HeapOnly&) = delete;
HeapOnly& operator=(const HeapOnly&) = delete;
};
注意:这里通过私有化构造函数阻止了栈上直接实例化,配合 new 操作符完成堆分配。
设计一个只能在栈上创建对象的类
若希望对象只能在栈上创建,需先将构造函数私有化,并禁用 operator new。随后提供一个静态成员函数返回对象实例。如果不搞成静态的话,没对象的时候调用不了。
构造函数私有化的意义在于防止外部使用 new A() 这样的堆分配方式。
{
:
{
StackOnly st;
st;
}
:
() {}
= ;
};


