【读书笔记】Effective C++-2 构造/析构/赋值运算(之二)

Effective C++读书笔记

--By Nathan.Yu 2007-11-14--

2 构造/析构/赋值运算(之二)

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

【要点摘录】所有编译器生成的函数都是publicinline的。

如何阻止拷贝行为?

copy构造函数和copy assignment操作符声明为private,并不去定义(实现)它们。借由明确声明一个成员函数,阻止了编译器暗自创建其专属版本;而令这些函数为private,可以阻止人们调用它;只声明而不实现,则如果在成员函数或friend函数中调用它们,会产生链接错误。

【扩展】C++ iostream就是使用这个方法来组织copying行为的。

一个更好的方法:

把链接期错误移至编译期,并可复用代码。即使用Uncopyable base class阻止拷贝:

class Uncopyable{

protected: //允许derived对象构造和析构

Uncopyable(){}

Uncopyable(){} //不一定得是virtual

private:

Uncopyable(const Uncopyable&)//阻止copying

Uncopyable& operator=(const Uncopyable&)

};

/*

不含数据成员,符合EBO(empty base class optimization)资格

总是扮演base class角色,导致多重继承。而多重继承有时会阻止EBO

Boost版本:noncopyable

*/

class MyClass: private Uncopyable{ // 使用私有继承

………..

};

请记住:

为驳回编译器自动提供的机制,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值