zoukankan      html  css  js  c++  java
  • Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝

    (整理自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也是一种做法。

  • 相关阅读:
    2018 南京网络预赛Sum
    一个莫比乌斯等式的证明
    LOJ 2452 对称 Antisymmetry——用hash求回文串数
    LOJ 103子串查找——用hash代替kmp算法
    LOJ2823 三个朋友 ——查询字串的哈希值
    hash入门
    2019牛客暑期多校训练营(第十场)Coffee Chicken——递归
    2019牛客暑期多校训练营(第十场)Han Xin and His Troops——扩展中国剩余定理
    mutex 的 可重入
    Linux 编译安装Boost
  • 原文地址:https://www.cnblogs.com/hust-ghtao/p/3786146.html
Copyright © 2011-2022 走看看