オブジェクトをスタックまたはスタックにのみ構築できるように制限する方法

2310 ワード

C++では、クラスのオブジェクト確立は2つに分けられ、1つはA aのような静的確立である.もう1つは、A*ptr=new Aなどの動的確立である.この2つの方法には違いがある.
             ,                 ,           ,       ,                       。      ,          。

           ,   new             。        ,      operator new()  ,                 ;              ,         。    ,          。

                        ?        。

1、スタックにしかできない
              ,           ,             。

                 。         ,                  ,    new        。  ,      ,new            ,C++  new      ,        operator new()  , operator()        ,        。  ,       。

              ,            ,            。       ,                     。               。               ,        ?  ,          ,                。  ,              ,              ,         ,         ,         。            ,                   。

      ,         ,            。    :

[cpp] view plaincopyprint? class A { public: A(){} void destory(){delete this;} private: ~A(){} }; A aを使ってみます.をクリックしてオブジェクトを作成し、エラーをコンパイルし、構造関数にアクセスできないことを示します.これによりnewオペレータを使用してオブジェクトを作成するしかなく、コンストラクション関数は共通であり、直接呼び出すことができます.クラスには、メモリ領域の解放を行うdestory関数が必要です.クラスオブジェクトの使用が完了したら、destory関数を呼び出す必要があります.上記の方法の1つの欠点は,継承問題を解決できないことである.Aが他のクラスのベースクラスである場合、構造関数は通常virtualに設定され、サブクラスで書き換えてマルチステートを実現します.したがって、構造関数をprivateに設定することはできません.C++は3番目のアクセス制御、protectedを提供しています.構造関数をprotectedに設定すると、クラス外ではprotectedメンバーにアクセスできず、サブクラスではアクセスできます.
          ,        ,  new    ,   destory      ,     delete。(  delete   ,  delete     ,          ,           )          。    ,         protected,      public static       ,     new,           ,         。    ,       :

[cpp] view plaincopyprint? class A { protected: A(){} ~A(){} public: static A* create() { return new A(); } void destory() { delete this; } }; これにより、create()関数を呼び出してスタック上にクラスAオブジェクトを作成し、destory()関数を呼び出してメモリを解放します.
2、スタックにしか建てられない
        new   ,         ,  ,    new                  。 operator new()      。    :

[cpp] view plaincopyprint? class A{private:void*operator new(size_t){}//注意関数の最初のパラメータと戻り値は固定されたvoid operator delete(void*ptr){}//newをリロードするにはdelete public:A(){}~A(}}}をリロードする必要があります.
参照先:http://blog.csdn.net/g5dsk/article/details/4775144
——The End——