愚公移山

死而后已

C++博客 首页 新随笔 联系 聚合 管理
  1 Posts :: 11 Stories :: 0 Comments :: 0 Trackbacks

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也是一种做法。

posted on 2007-11-27 00:53 Nathan.Yu 阅读(107) 评论(0)  编辑 收藏 引用 所属分类: Effective C++(3E)读书笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理