(整理自Effctive C++,转载请注明。整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/

通常如果你不希望class支持某一特定机能,只要不声明对应函数就是了。但这个策略对copy构造函数和copy assignment操作符却不起作用,你如果不声明它们,而某些人尝试调用它,编译器会为你声明它们。

这把你逼到了一个困境。如果你不声明copy构造函数和copy assignment操作符,编译器可能为你产出一份,于是你的clas支持copying。如果你声明它们,你的class还是支持copying。但这里的目的却是要阻止copying。

答案的关键是,编译器所产出的函数都是public。你可以将copy构造函数或copy assignment操作符声明为private。借由明确声明一个成员函数,你阻止了编译器暗自创建其专属版本;而令这些函数为private,使你得以成功阻止人们调用它。

这个做法并不绝对安全,因为member函数和friend函数还是可以调用你的private函数。你可以“将成员函数声明为private而且故意不实现它们”,这样,如果你试图通过member函数和friend函数调用它,链接器会发出抱怨。

将链接期的错误移至编译期是可能的,只要将copy构造函数和copy assignment操作符声明为private就可以办到,但不是在derived class类自身,而是在一个专门为了阻止copying动作而设计的base class 内:

   1: class Uncopyable{

   2: protected:

   3:     Uncopyable(){}

   4:     ~Uncopyable(){}

   5: private:

   6:     Uncopyable( const Uncopyable& ) ;

   7:     Uncopyable& operator=( const Uncopyable& );

   8: };

   9:  

  10: class Derived:private Uncopyable{

  11:     ...

  12: };

这行得通,因为只要任何人——甚至是member函数或friend函数——尝试拷贝Derived 对象,编译器便试着生成一个copy构造函数和一个copy assignment操作符,这些函数的“编译器生成版”会尝试调用其base class的对应兄弟,那些调用会被编译器拒绝,因为其base class的拷贝函数为private。

请记住:

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

Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝的更多相关文章

  1. 【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝

    地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子 class HomeFoeSale { ......} 但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作 ...

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

    为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...

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

    class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForS ...

  4. Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...

  5. Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝

    一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...

  6. 读书笔记 effective c++ Item 6 如果你不想使用编译器自动生成的函数,你需要明确拒绝

    问题描述-阻止对象的拷贝 现实生活中的房产中介卖房子,一个服务于这个中介的软件系统很自然的会有一个表示要被销售的房屋的类: class HomeForSale { ... }; 每个房产中介会立刻指出 ...

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

    规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ...

  8. 条款6:若不想使用编译器自动生成的函数,就该明确拒绝(Explicity disallow the use of compiler-generated functions you do not want)

    class uncopyable{ protected: uncopyable(){};                                                         ...

  9. [Effective C++ --006]若不能使用编译器自动生成的函数,就该明确拒绝

    ■本文内容■□第一节 <引言> 在条款五的讲解中,我们已经知道编译器是聪明的家伙,它会帮助你生成类的构造函数.析构函数.一个copy构造函数和一个赋值运算符.有时真的要感谢编译器所做的这一 ...

随机推荐

  1. ZOJ2849 优先队列BFS

    Attack of Panda Virus Time Limit: 3 Seconds      Memory Limit: 32768 KB In recent months, a computer ...

  2. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  3. 开源的Android视频播放器

    之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问 ...

  4. [置顶] CSS+DIV总结

         HTML在Web飞速发展的过程中起着重要作用,有着重要地位.HTML初衷是为了表达标签(<p>.<table>)的内容信息.同时文档布局由浏览器来完成,不使用任何格式 ...

  5. CentOS下Samba文件服务器的安装与配置

    CentOS下Samba文件服务器的安装与配置 http://blog.csdn.net/limingzhong198/article/details/22064801 一.安装配置 1. 安装sam ...

  6. BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

    矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...

  7. 学习linux能有什么用

    很多朋友装了 Linux,看着全新的菜单样式.陌生的程序,一下子脑袋就空了(特别是系统未安装中文语言支持时),不知该干点什么,于是一种强烈的想法涌上心头——还是先回瘟到死玩一会儿游戏再说吧~ 在这,我 ...

  8. silentScroll() 滚屏

    jQuery.mobile.silentScroll( yPos ) 滚动到一个特定的Y坐标位置,没有触发涡旋的事件监听器 yPos:Y坐标.类型:数字.默认值: //滚屏到y 100px处 $.mo ...

  9. 令牌桶在数据通信QoS流量监管中的应用

    令牌桶(Tocken Bucket,以下简称TB)在流量监管(以下简称CAR)功能中完成对流量进行限速的作用.流量监管主要是应用与网络边缘,从而保证核心设备的正常数据处理. 在流量监管的处理过程中,首 ...

  10. DFS深搜——Red and Black——A Knight&#39;s Journey

    深搜,从一点向各处搜找到全部能走的地方. Problem Description There is a rectangular room, covered with square tiles. Eac ...