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

拒绝方法

上一节中说编译器为我们合成课一些函数,他们不仅仅功能简陋,甚至有时是我们所明令禁止的。比如说复制,在业务逻辑上,有些先天独一无二的东西是不允许复制的。

对于其他功能,只要我们在类中不去声明定义,那么自然不会有此功能,但对于copy构造函数和copy assignment操作符就不会起作用。正如上一节所说,若果不去声明定义,那么编译器会为我们声明他们。这里有一个办法:

class Example{
public:
...

private:
Example(const Example&);
Example& operator=(const Example&);
};

看出来了吗?我们将函数写到了private里,这样当我们的用户(类的使用者)尝试copy时,编译就会报错。在c++ iostream程序库中阻止copy的行为也是这个样子,可以自己去查查看。但这么写还是有个缺陷,就是友元函数和成员函数还是有可能调用copy。为了追求完美,

class Uncopyable{
protected:
Uncopyable() { }
~Uncopyable() { }
private:
Uncopyable (const Uncopyable&);
Uncopyable& operator=(const Uncopyable&)
};

将copy的行为放入一个专门的基类中。那么

class Example:private Uncopyable{

....

};

此时任何尝试copy Example对象的行为都是不允许的。

说的直白点,就是我们自定义出函数,阻止编译器为我们合成他们,然后将我们自定义的函数处于不可用状态。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值