zoukankan      html  css  js  c++  java
  • 条款6:显式拒绝编译器生成的默认函数

    如果一个对象是独一无二的,那么我们就不应该提供copy构造函数和copy assignment操作符函数(二者统称为copying函数)。但是即使我们不定义它们,编译器也会在别人调用它们时默认提供,如何拒绝编译器的这种行为呢?

    由于编译器自动生成的函数都是public的,因此你可以提privatecopying函数,而不实现它们,这样做有如下3点好处:

    1>  防止编译器自动生成这些函数。

    2>  声明为private可以阻止外部人员调用它们。

    3>  只声明不实现可以防止member函数和firend函数调用它们。

     

    C++ iostream标准库中防止copying行为的做法就是这样的,类似于如下定义:

     1 class Uncopy
     2 {
     3 public:
     4     Uncopy();
     5   ~Uncopy();
     6 
     7 private:
     8     Uncopy(const Uncopy& rhs);              // 只声明不实现
     9     Uncopy& operator=(const Uncopy& rhs);   // 只声明不实现
    10 };
    11 Uncopy::Uncopy(){ }
    12 Uncopy::~Uncopy(){ }

    如果外部有人调用copying函数的话,会在链接期间发生错误。还有一种办法是将错误提示转移至编译期,这样可以尽早做出响应,具体为:将私有的copying函数在基类中声明,让派生类来做具体业务,如下所示:

     1 class Uncopyable
     2 {
     3 public:
     4     Uncopyable();
     5     ~Uncopyable();
     6 
     7 private:
     8     Uncopyable(const Uncopyable& rhs);              // 只声明不实现
     9     Uncopyable& operator=(const Uncopyable& rhs);   // 只声明不实现
    10 };
    11 Uncopyable::Uncopyable(){ }
    12 Uncopyable::~Uncopyable(){ }
    13 
    14 class DecCopy : private Uncopyable
    15 {
    16     
    17 };

    当我们调用DecCopy的copying函数时,编译器试图生成这些函数,进而尝试调用其基类的copying函数,碰到private后,终止生成过程。

     

    总结:

    为了防止编译器自动生成函数,可将对应的函数声明为private而不实现它们;或者使用类似于Uncopyable的基类,本质上是一样的道理。

  • 相关阅读:
    BZOJ 1069 最大土地面积
    BZOJ 1059 矩阵游戏
    BZOJ 3570 动物园
    Luogu 3934 Nephren Ruq Insania
    Luogu 3233 [HNOI2014]世界树
    CF613D Kingdom and its Cities
    Luogu 4001 [BJOI2006]狼抓兔子
    Luogu 2824 [HEOI2016/TJOI2016]排序
    POJ 3463 Sightseeing
    Luogu 2495 [SDOI2011]消耗战
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4527076.html
Copyright © 2011-2022 走看看