您的位置:首页 > 职场人生

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

2012-02-09 22:53 387 查看
所有编译器产生出来的函数都是public。为了阻止编译器自动声明赋值操作符和赋值构造函数,可以声明这些函数为private。藉由明确声明一个成员函数,你阻止了编译器暗自创建其专属版本。令这些函数为private阻止别人调用它。

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

这个做法并不绝对安全,因为成员函数和friend函数还是可以调用你的private函数。

如果有人不慎调用了任何一个,会获得一个连接次错误(linkage error),“将成员函数声明为private而且故意不实现它们”

将连接期错误移至编译期是可能的,只要将copy构造函数和赋值操作符声明为private,不是自身,而是在基类中:

class Uncopyable
{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
//为了阻止HomeForSale对象被拷贝,我们唯一需要做的就是继承Uncopyable:
class HomeForSale:private Uncopyable
{
...
};


为了驳回编译器自动提供的机能,可将相应的成员函数声明额外private并且不予实现,使用想Uncopyable这样的基类也是一种做法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 职场 编译器
相关文章推荐