effect C++ 若不想使用编译器自动生成的函数,就该拒绝

阻止copying

所有的编译器产出的函数都是public。为阻止这些函数被创建出来,得自行声明它们。将copy构造函数或copy assignment操作符声明为private。阻止了编译器暗自创建其专属版本。

一般这个做法并不安全,因为friend和member 还是可以调用。所以,将成员函数声明为private而且故意不实现它们。

class HomeForSale{
public:
...
private:
...
HomeForSale(const HomeForSale&); //只有声明
HomeForSale&operator=(const HomeForSale&);
};
当客户企图拷贝HomeForSale对象,编译器会阻挠他。如果在member函数和friend函数内那么做,轮到连接器发出抱怨。


使用base class

将连接期间错误移至编译期是可能的,在一个专门阻止copying动作而设计的base class将copy构造和copy assignment 操作符声明为private

class Uncopyable{
protected:
 Uncopyable(){}       //允许derived对象构造和析构
 ~Uncopyable(){}
 private:
  Uncopyable (const Uncopyable&);  //阻止copy
  Uncopyable&operator=(const Uncopyable&);
}
  //继承Uncopyabke
class HomeForSale:private Uncopyable{
  ... //class 不再声明copy构造或copy assign操作符
}
因为其 base class 的拷贝函数是private,只要任何人尝试拷贝HomeForSale对象。就会被编译器拒绝。


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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值