C++ダミー構造関数

2790 ワード

C++ダミー構造関数
 
タイプがダミー構造関数を必要とするもう1つの特徴は、ポインタメンバーまたは参照メンバーを持つことです.ポインタ・メンバーと参照メンバーがある場合、このタイプは通常、構造関数およびコピー操作を実装する必要があります.
 
通常、構造関数を実装するタイプは、コピー構造関数とコピーレプリケーション関数を実装する必要があります.
 
経験則として:
虚関数機能を持つクラスがある場合は、次の理由で虚構造関数が必要です.
 
1.クラスに虚関数機能がある場合は、ベースクラスとしてよく使用されます.
 
2.ベースクラスの場合、派生クラスはnewを使用して割り当てることが多い.
 
3.派生クラスオブジェクトがnewを使用して割り当てられ、そのベースクラスを指すポインタによって制御される場合、そのベースクラスを指すポインタによって削除されることがよくあります(ベースクラスに虚構造関数がない場合、結果は不確定になり、実際に発生した場合、派生クラスの構造関数は呼び出されません).
ベースクラスにダミー構造関数がある場合,最下層の派生クラスの構造関数が最初に呼び出され,次いで各ベースクラスの構造関数が呼び出される.
保護的な構造関数としての役割はまだ分からない.ここには一つの解釈がある.http://blog.csdn.net/huzzyy/article/details/2562804  .わかりました.後で補充します.
保護として宣言された構造関数について、ネット上では次のような解釈があります.
1、        ,              ,         virtual   ,
                    (               ;    delete) ,
                          ,         。
          virtual         ,            virtual   ,
          vtable,    vptr          。                       ,
          protected(                   delete    ,              ),
         。
2、          。
      ,          ,    :
        ,     ,             ,        ?              ,         ,      ,        ,    ,                ,   !       ,        protected  private,          “  ”      。
  protected   ,   “  ”          。
   private   ,     “  ”        。

          ,        。
                      protected   private ?

         :
1。                  (         A)   ,            A   ,       A     /       protected,   A        /       public。  :
class A
{ protected: A(){}
  public: ....
};
calss B : public A
{ public: B(){}
  ....
};

A a; // error
B b; // ok

2.        /       private,       “  ”              。     “  ”         ,       。
class A
{
private:
    A(){  }
    ~A(){ }

public:
    void Instance()// A        
    {
        A a;
    }
};
            。      Instance     A        。Instance          A   。
  ,  Instance             。    ?
     Instance  ,            。          private  。              。
A aObj; //      
aObj.Instance();
  ,  Instance   static      ,            ,        。  :class A
{
private:
    A():data(10){ cout << "A" << endl; }
    ~A(){ cout << "~A" << endl; }

    public:
    static A& Instance()
    {
        static A a;
        return a;
    }

    void Print()
    {
        cout << data << endl;
    }

private:
    int data;
};

A& ra = A::Instance();
ra.Print();

            singleton        C++    。


       :          operator=(       )   private,       。
                             。
    《effective C++》       。          。      。

本文の著作権は作者kanegoとブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.