怎样禁止C++ 类支持拷贝
怎样禁止C++ 类支持拷贝
C++ 编译器默默地为你做了不少工作
- 当你写下
class Empty {}; //事实上等价于 class Empty { public: Empty() { ... } //default constructor Empty(const Empty &rhs) { ... } //copy constructor ~Empty() { ... } //destructor Empty& operator=(const Empty &rhs) { ... } //copy assignment };
- 然而,有的时候,你却想禁止类进行复制。
假设你不声明 copy 构造函数或者 copy assignment 操作符,编译器将为你产生一份;假设你声明他们。你的类相同支持 copying。
解决方式:
- 将拷贝构造函数和copy assignment 声明为 private, 并不给出实现; 一般而言,member 函数和 friend 函数还是有可能调用它们,这会导致一个链接错误(由于你未定义函数)
class A { public: private: A(const A &rhs); //仅仅有声明 A& operator=(const A &rhs); };
- 更好的做法。能够将做法1 的连接错误转移到编译期(越早发现错误越好)。让类继承 例如以下的base 类这可行的原因在于:仅仅要不论什么人----甚至是 member 函数 或 friend 函数-----尝试拷贝对象,编译器都会试着生成一个 copy 构造函数和
copy assignment 操作符。而这些函数的“编译器生成版”会尝试调用 base class 的相应兄弟,而这些调用会被编译器拒绝,因此 base class 的拷贝函数是 private。
class Uncopyable { public: Uncopyable() {} ~Uncopyable() {} private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; class B : private Uncopyable { };
另一点须要注意的是,继承用 private 而不是 public。这样能够阻止public继承时。下列的代码:(内存泄漏,由于通过基类的指针删除派生类对象,基类必须是 virtual 虚函数,否则内存泄漏)Uncopyable *p = new B(); ... delete p;