0

このインタビューの質問の例を見つけました。それを理解するための助けが必要です。

#include <iostream>

class A
{
public:
    A(int n = 0)
        : m_n(n)
    {
        ++m_ctor1_calls;
    }

    A(const A& a)
        : m_n(a.m_n)
    {
        ++m_copy_ctor_calls;
    }

public:
    static int m_ctor1_calls;
    static int m_copy_ctor_calls;

private:
    int m_n;
};

int A::m_ctor1_calls = 0;
int A::m_copy_ctor_calls = 0;

void f(const A &a1, const A &a2 = A())
{
}

int main()
{
    A a(2), b = 5;
    const A c(a), &d = c, e = b;
    std::cout << A::m_ctor1_calls << A::m_copy_ctor_calls;
    b = d;
    A *p = new A(c), *q = &a;
    std::cout << A::m_copy_ctor_calls;
    delete p;
    f(3);
    std::cout << A::m_ctor1_calls << A::m_copy_ctor_calls << std::endl;

    return 0;
}

私の理解では、main の最初の行で 2 つの新しいオブジェクトが作成され、コンストラクターが 2 回呼び出されます。2 行目では、c(a) と e = b に対してコピー コンストラクターを使用していることがわかります。&d = c は c を参照しているだけなので、コピー コンストラクターは使用されません。また、私が理解していないことの1つは、コピーコンストラクターが参照を必要とする場合、オブジェクトへの参照ではなくオブジェクトが渡されるのはなぜですか? ポインターの後の部分は、私にとって本当に紛らわしいです。誰かが洞察を提供できますか?

ありがとう!

4

2 に答える 2

0

&d = c は c を参照しているだけなので、コピー コンストラクターは使用されません。

はい。d は c のエイリアスになります。

また、私が理解していないことの1つは、コピーコンストラクターが参照を必要とする場合、オブジェクトへの参照ではなくオブジェクトが渡されるのはなぜですか?

参照を取る関数に渡されたオブジェクトは、自動的に参照に「変換」されます。パラメータは、渡されたオブジェクトのエイリアスになりました。

ポインターの後の部分は、私にとって本当に紛らわしいです。誰かが洞察を提供できますか?

p は、c からコピーされた、新しく割り当てられた A オブジェクトを指します。q は a を指します。(1 つのコピー コンストラクター)。次に p を削除します。

f(3) は楽しくなります。a1 にバインドするために 3 で初期化された一時的な A を構築します。a2 は、構築された一時的なデフォルト A を取得します。 f(3) が終了すると、これら 2 つの一時変数は破棄されます。

関数の終了、および A の残りのインスタンスは破棄されます。

于 2013-02-28T02:24:24.237 に答える
-1

インタビュー以外では、このコードをIDEに貼り付けて、デバッガーを使用してステップスルーできます。

ご参考までに、出力(スペースを追加)は次のとおりです。22 3 4 3

于 2013-02-28T01:04:33.830 に答える