0

C++ には 2 つのコンストラクターがあり、初期化ロジックが重複しないようにするために、1 つのコンストラクターがもう 1 つのコンストラクターを呼び出します。

#include <iostream>
#include <memory>

using namespace std;

class A
{
    int x;
    int y;
public: 
    A(int x)
    {
        cout << this << endl;
        this->x = x;
    }

    A()
    {
        cout << this << endl;
        A(20);
    }

    ...
};

興味深いのは、A() が A(int) を呼び出していることですが、このポインターは別のアドレスを指しています。どうしてこれなの?それとも、これは g++ のバグですか?

int main(int argc, char *argv[]) {
    A* a = new A();
}

0x7fa8dbc009d0 <-- from A()
0x7fff67d660d0 <-- from A(int)
4

2 に答える 2

5

A(20);同じインスタンスで他のコンストラクターを呼び出すのではなく、そのコンストラクター内で A の別のインスタンスを構築していると思います。

C++ で別のコンストラクターからコンストラクターを呼び出す (コンストラクター チェーンを行う) ことはできますか? を参照してください。コンストラクターから別のコンストラクターを呼び出す方法について。

A()C++11 をサポートするコンパイラを使用している場合は、このコンストラクターの定義で目的を達成できると思います。

A(): A(20)
{
    cout << this << endl;
}
于 2013-06-19T21:18:07.530 に答える
1

A(20);は、のコンストラクタのA呼び出しではなく、の新しいインスタンスを構築するステートメントです。Athis

C++03 では、特定のコンストラクター内で別のコンストラクター オーバーロードを呼び出すことはできません。ただし、placement new を使用して同じ効果を得ることができます。交換:

A(20);

あなたのコードで:

new (this) A(20);
于 2013-06-19T21:32:58.727 に答える