您的位置:首页 > 编程语言 > C语言/C++

Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝

2017-08-06 21:25 337 查看

规则一 将成员函数声明为private而且故意不实现他们

class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&);             // 只有声明
HomeForSale& operator=(const HomwForSale&);  // 只有声明
}


有的时候为了阻止copy构造函数或者copy assignment操作符,可以将他们声明为private,但是这个做法不绝对安全,因为member函数和friend函数还是可以调用private函数的。但是如果你只声明,不实现它们的话,当调用者调用的时候会报链接错误(linkage error)。


规则二 将链接错误移至编译期

class Uncopyable {
protected:
Uncopyable () {}      // 允许derived对象构造和析构
~Uncopyalbe () {}
private:
Uncopyable(const Uncopyable&);   // 但阻止copying
Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale: private Uncopyable {  // class不再声明copy构造函数或copy assign.操作符
}

总结


为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。

使用像Uncopyable这样的base class也是一种做法。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐