0

次のコードがあります。

#include <iostream>
    #include <string>
    using namespace std;
    class Uno {
    public: Uno() { cout << "X"; }
    };



    int main()
    {
            Uno u;
            Uno k=u;

            return 0;
    }

したがって、私が理解していることから、コードUno k=u;は u のコピーを作成します。コンストラクタが2回呼び出されているようです。「XX」を期待していますが、プログラムは「X」しか出力しません。何が起こっているのか説明していただけますか?

ありがとうございました

4

5 に答える 5

3

何が起こっているかというと、次のとおりです。

Uno k = u;

オブジェクトからオブジェクトをコピー構築する(コピー)初期化です。コピー構築とは、既定のコンストラクターではなく、コピー コンストラクター (この場合はコンパイラによって暗黙的に生成される) が呼び出されることを意味します。UnokUnou

これが、出力したメッセージが の初期化中に出力されない理由ですk。コンストラクタは呼び出されません。代わりに、別の(暗黙的に生成された) コンストラクターが呼び出されます。

また、上記の宣言は一般的にこれと同等ではないことに注意してください。

Uno k;
k = u;

この最後のスニペットでは、式k = u代入であり、初期化ではありません。どちらの構文も=符号を使用していますが、混乱させてはいけません。

于 2013-06-29T00:46:08.657 に答える
1

これは、クラスにコピー コンストラクターがないためです。コピー コンストラクターが作成されていない場合、C++ は既定のコンストラクターを呼び出します。明らかに cout<<"X" 行がありません。

Uno u;     // your constructor called, --> X to output
Uno k = u; // default copy constructor called

ただし、メンバー変数がない場合、コピー コンストラクターは意味がありません。

だから、これがあなたが望むものだとしましょう:

#include <iostream>
#include <string>

using namespace std;

class Uno
{
  public:

    string text;

    // constructor
    Uno()
    {
        text = "X";
        cout << text;
    }

    // copy constructor
    Uno(const Uno &o)
    {
        text = o.text;
        cout << text;
    }
};

int main()
{
        Uno u;        // call constructor -> X
        u.text = "Y"; // change text in constructed object
        Uno k=u;      // create new object via calling copy constructor --> Y
                      // so u.text copied to k.text

        return 0;
}

私はlearncpp.comの記事をお勧めします。それらは非常に便利で、物事をシンプルに保ちます.

コピー コンストラクターと代入演算子の詳細: http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/

于 2013-06-29T01:10:00.917 に答える
1

kを出力しないデフォルトのコピー コンストラクターを使用して作成されていますX

これを追加してみてください:

Uno(const Uno&) { cout << "Y"; }

XY代わりに出力が表示されるはずです。

于 2013-06-29T00:45:09.570 に答える
1

この場合、新しいオブジェクトを作成していないため、コンストラクターは呼び出されていないと思います。むしろ、古いオブジェクトを別の場所にコピーしています。

ただし、ポインターを使用していないため、ポインターは独立している必要があります。一方を変更しても他方には影響しません。

新しいものを作成していないため、コードはコンストラクターを 2 回実行しません。u のフィールドが作成された後に何らかの変更を加えたと想像してください。コンストラクターを再度呼び出しても u のコピーは作成されないため、C++ はそれを行いません。これは、写真をコピーするようなものです。コピーを行っても、カメラが 2 回オフになることはありません。別の写真が作成される可能性があるからです。代わりに、コピー機を介して実行しますが、これは別のことです。

編集:私が知らされたように、あなたが書いたものではなく、コンストラクターを実行します。私の比喩のカメラにコピー機が内蔵されていたとしましょう。もちろん、コピー機はフラッシュを発しません。

于 2013-06-29T00:45:10.120 に答える