标签:
class HomeForSale { ... };
HomeForSale h1;
HomeForSale h2;
HomeForSale h3(h1); // 企图拷贝h1,不应该通过编译
h1 = h2; // 企图拷贝h2,不应该通过编译 阻止这一类代码的编译并不是很直观.通常如果不希望 class 支持某一个特定机能,只要不声明对应的函数就可以了.但这个策略对copy构造函数和copy assignment操作符却起不到作用.因为条款5已经指出,如果不声明它们,而某些人尝试调用它们,编译器会声明它们.class HomeForSale {
public:
...
private:
HomeForSale(const HomeForSale &); // 只有声明
HomeForSale& operator=(const HomeForSale&);
}; 有了上述定义,当客户企图拷贝HomeForSale对象,编译器会阻止它.如果不慎在member函数或 friend 函数内那么做,连接器则会阻止.class Uncopyable {
protected: // 允许derived对象构造和析构
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&); // 阻止copying
Uncopyable* operator=(const Uncopyable&);
};
为了阻止HomeForSale对象被拷贝,唯一需要做的就是继承Uncopyable:
class HomeForSale : private Uncopyable { // class不再需要声明copy构造函数
}; 这是行得通的,因为只要任何人——甚至是member函数或 friend 函数——尝试拷贝HomeForSale对象,编译器便试着生成一个copy构造函数和一个copy assignment操作符,而正如条款12所述,这些函数的"编译器生成版"会尝试调用其base class 的对应兄弟,那么调用会被编译器拒绝,因为其base class 的拷贝函数是 private.版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/48026559