禁止构造:用于单例
禁止拷贝:保持唯一性
禁止继承:防止泛化
禁止构造
深拷贝与浅拷贝的区别
两个对象能够完全独立 --> 深拷贝
两个对象存在某种联系 --> 浅拷贝
禁止拷贝/赋值
- 将拷贝构造函数 与 operator= 均声明为
private
;
- 用
delete
标记,编译器不会合成默认成员,参考Defaulted & Deleted;
- 不提供方法的实现,防止
friend
。
空类的默认成员有6个:
1 2 3 4 5 6 7 8
| class Empty{};
Empty(); ~Empty(); Empty(const Empty &); Empty & operator=(const Empty &); Empty * operator&(); const Empty * operator&() const;
|
禁止拷贝/赋值示例 (可用于派生屏蔽拷贝构造和赋值操作的子类)
1 2 3 4 5 6 7 8 9 10 11
| #define DISABLE_COPY(Class) \ Class(const Class &); \ Class &operator=(const Class &) class Widget { public: int* pi; private: DISABLE_COPY(Widget); };
|
禁止继承
- C++11 关键字
sealed
;
- C++11 关键字
final
;
- 虚继承一个拥有私有构造函数的基类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class SealedClass { private: SealedClass() { }; friend class SealedClassTest; };
class SealedClassTest:private virtual SealedClass { public: SealedClassTest(); ~SealedClassTest(); };
|