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

对于一个class而言,如果你不希望支持某个特定机能,只要不声明对应函数就是了,但是这个策略对于C++编译器会默默给你生成的函数(default构造函数、析构函数、copy构造函数和copy assignment操作符)而言却不起作用,如果你不声明它们,而某些人尝试调用,编译器就会为你声明它们。

如果你要阻止这些行为:因为编译器产出的函数都是public,为了阻住它们,你可以将其声明为private。但这个方法不是绝对安全的,因为member函数和friend函数还是可以调用private函数。所以将函数声明为private而且故意不去实现它们(C++11可以声明为delete即可)。例如标准库例的ios_base、basic_ios和sentry,其copy构造函数和copy assignment操作符都被声明为private而且没有定义。

你可以专门设计一个类来专门阻止copying动作二设计的base class内,然后再继承于这个class:

class UnCopyable
{
protected:
	UnCopyable(){}
	~UnCopyable(){}
private:
	UnCopyable(const UnCopyable&);				//阻止copying
	UnCopyable& operator=(const UnCopyable&);
};

//阻止对象拷贝,唯一要做的就是集成UnCopyable
class HomeForSale : public UnCopyable       	//class不再什么copy构造函数
{												//或copy assignment操作符
	...
};

总结

  • 为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。像上述UnCopyable这样的基类也是一种做法(C++11直接将其声明为delete即可)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值