在 C++ 面向对象编程中,类不仅是数据的容器,更是行为与规则的封装。实际开发里,我们常会遇到一些特殊场景:比如防止对象被随意拷贝导致资源重复释放,或者限定对象只能在堆或栈上创建以规范内存管理,甚至需要禁止类被继承来保护核心逻辑,亦或是确保全局只有一个实例。这些需求的核心,就是特殊类的设计。
设计一个不能被拷贝的类
有些类一旦拷贝,就会引发深拷贝问题或资源冲突。要阻止这种情况,最直接的办法就是禁用拷贝构造函数和赋值运算符。
在 C++98 时代,通常的做法是将这两个函数声明为私有且不定义,这样外部调用时会链接失败。到了 C++11,delete 关键字让这件事变得简洁明了,直接告诉编译器'这个函数别生成'。
class NonCopyable {
public:
// 默认构造
NonCopyable() = default;
private:
// C++11 方式:显式删除
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
};
设计一个只能在堆上创建对象的类
有时候我们希望对象的生命周期完全由程序控制,不希望它在栈上分配(例如避免析构顺序问题)。实现思路是:把构造函数设为私有,并暴露一个静态工厂函数来负责 new。
这里有个细节要注意,如果只私有化构造函数而不删除拷贝操作,对象依然可以通过指针拷贝。所以必须同时禁用拷贝。
class HeapOnly {
public:
static HeapOnly* CreateObj() {
return new HeapOnly();
}
void Destroy() {
delete this;
}
private:
HeapOnly() {}
~HeapOnly() {}
// 禁用拷贝
HeapOnly(const HeapOnly&) = delete;
HeapOnly& operator=( HeapOnly&) = ;
};




