3

次のコードでは:

class A
{
    A() {}
    friend class B;
};

class B
{
public:
    void foo() {A* p=new A;};
};


int main()
{
    B b;
    b.foo();

    A* p = new A;

    return 0;
}

関数foo()はコンパイルに合格しますが、行は合格A* p = new A;しません。どうすればいいの?newグローバル演算子であるため、プライベートコンストラクターを呼び出すことはできません。なぜコンパイラーfoo()も文句を言わないのですか?

4

3 に答える 3

3

operator new 関数はコンストラクターを呼び出しません。必要なストレージを割り当てるだけです。

fooコンストラクターは後でコンパイラー マジックによって呼び出され、それぞれ およびによって実行されると見なされますmain

于 2012-09-14T12:23:55.567 に答える
2

新しい式は、operator newメモリを割り当てるための呼び出し (コンストラクターを呼び出さず、アクセスは必要ありません) とコンストラクターへの呼び出しで構成されます。コンストラクターへの呼び出しは、コンストラクター B::fooにアクセスできる式のコンテキストで行われます。

于 2012-09-14T12:26:12.477 に答える
1

new-expression は次の 2 つのことを行います。

  • オーバーロードを呼び出してoperator newメモリを取得します。
  • そのメモリ内にオブジェクトを構築します。

構築は、 への呼び出しではなく、new-expression のコンテキストで行われoperator newます。したがって、コンストラクターはそのコンテキストでアクセス可能でなければなりません。あなたの例では、ではアクセスできますが、ではアクセスできB::fooませんmain

于 2012-09-14T12:27:04.467 に答える