一、设计一个不能被拷贝的类
1.1 为什么需要不能被拷贝的类
某些场景下,拷贝逻辑是不合理的。例如 IO 流包含缓冲区,线程对象已运行时等。禁止拷贝通常通过禁用拷贝构造函数和赋值运算符实现。
1.2 实现策略
C++98 中的做法:私有化并声明不定义
将拷贝构造函数和赋值运算符声明为私有且不定义。
class CopyBan {
public:
// ...
private:
CopyBan(const CopyBan& cb);
CopyBan& operator=(const CopyBan& cb);
};
私有化防止实例化对象执行拷贝;只声明不定义是因为若定义了函数且未被调用,编译器仍可能生成默认拷贝构造,导致允许拷贝。
C++11 中的做法:使用 = delete
在函数声明后添加 = delete。
class CopyBan {
public:
CopyBan(const CopyBan& cb) = delete;
CopyBan& operator=(const CopyBan& cb) = delete;
private:
// ...
};
= delete 指示编译器显式删除该函数。
二、设计一个类只能在堆上创建对象
2.1 策略
构造函数私有化 + 静态工厂方法
封锁栈上创建对象的途径,提供公共静态接口在堆上创建对象。
class HeapOnly {
public:
static HeapOnly* CreateObject() { return new HeapOnly; }
private:
HeapOnly() {}
HeapOnly(const HeapOnly& ho) = ;
HeapOnly& =( HeapOnly& ho) = ;
};

