1. C++特殊类设计概述
在C++开发中,特殊类设计是每个中高级开发者必须掌握的技能。所谓特殊类,指的是具有特定限制或特殊行为的类,它们往往需要在编译器层面就实现某些约束。这类设计常见于框架开发、库设计和安全敏感场景中。
我见过太多项目因为忽视特殊类设计而导致的内存泄漏、资源竞争和安全漏洞。比如一个本该只在栈上存在的对象被意外new到了堆上,或者一个禁止拷贝的类被多线程共享导致数据紊乱。这些问题的根源往往在于类设计阶段没有做好约束。
特殊类设计主要解决三类问题:
- 对象生命周期控制(堆/栈创建限制)
- 对象复制行为控制(拷贝/移动限制)
- 类继承关系控制(禁止继承)
2. 不能被拷贝的类设计
2.1 设计原理与需求场景
禁止拷贝的类在资源管理场景中尤为重要。想象一下文件句柄类 - 如果允许随意拷贝,多个对象可能同时持有同一个文件句柄,当其中一个对象析构关闭文件后,其他对象还在尝试操作已关闭的文件,必然导致程序崩溃。
另一个典型场景是包含指向堆内存指针的类。默认的拷贝构造函数只会进行浅拷贝,如果允许拷贝,多个对象会共享同一块堆内存,析构时可能发生多次释放。
2.2 C++98实现方案
在C++98中,我们通过将拷贝构造函数和拷贝赋值运算符声明为private并不予实现来实现禁止拷贝:
cpp复制class NonCopyable98 {
private:
NonCopyable98(const NonCopyable98&); // 不实现
NonCopyable98& operator=(const NonCopyable98&); // 不实现
public:
NonCopyable98() = default;
};
这种方式的缺点是:
- 错误提示不够友好 - 链接期才会报错
- 需要为每个类重复编写这些代码
- 友元类仍能访问private成员
2.3 C++11改进方案
C++11引入了=delete语法,可以更直观地禁止函数:
cpp复制class NonCopyable11 {
public:
NonCopyable11() = default;
NonCopyable11(const NonCopyable11&)
