C++ 特殊类设计实战
在 C++ 面向对象编程中,类不仅是封装数据与行为的容器,更是定义对象行为边界的关键。实际开发中,我们常遇到一些特殊约束场景:比如防止对象被意外拷贝导致资源重复释放,或者限制对象只能在堆或栈上创建以规范内存管理,甚至需要确保全局只有一个实例。这些需求构成了特殊类设计的核心范畴。
下面我们将逐一拆解五种典型特殊类的实现逻辑,结合代码示例分析其优缺点与适用场景。
设计一个不能被拷贝的类
要禁止对象拷贝,核心思路是阻止拷贝构造函数和赋值运算符的调用。
C++98 方案 将拷贝构造函数和赋值运算符声明为私有且不定义。编译器会尝试生成默认版本,但一旦用户代码尝试拷贝,链接阶段就会报错(因为找不到定义)。
C++11 方案
直接使用 = delete 显式删除这两个函数。这是更现代、更清晰的做法,编译期即可报错,提示明确。
class NoCopy {
public:
// C++11 方式推荐
NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
};
设计一个只能在堆上创建对象的类
如果希望对象必须动态分配,可以私有化构造函数,并提供一个静态工厂函数来负责 new 操作。
class HeapOnly {
public:
static HeapOnly* CreateObj() {
return new HeapOnly();
}
private:
HeapOnly() { /* ... */ }
// 禁用拷贝,避免指针拷贝后析构冲突
HeapOnly(const HeapOnly&) = delete;
HeapOnly& operator=(const HeapOnly&) = delete;
};
注意:这里同时禁用了拷贝,否则即使只能堆创建,拷贝出来的副本依然可能引发悬空指针问题。
设计一个只能在栈上创建对象的类
限制对象只能在栈上创建,意味着禁止使用 new。我们可以私有化构造函数,并删除全局 operator new。
{
:
{
StackOnly st;
st;
}
:
() { }
= ;
};


