コンストラクション関数、コンストラクション関数をプライベートと保護として宣言すると、オブジェクトはどのように作成されますか?


http://www.cnblogs.com/this-543273659/archive/2011/08/02/2125487.html
              ,         ,      ,        ,    ,                ???
 
      ,      c++     。

      ,        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++コード である.もう1つは、 、コピーコンストラクション とoperator=( オペレータの ロード)がprivateとして されますが、インプリメンテーションボディはありません.これの は,クラスの ユーザがこのクラスのオブジェクトをコピーすることを することである. は「effective C++」の を してください. にどの が えていませんか.