9

このコードの理由がわかりません。

class test{
    public:
    int number;
    test(int pass){
      number = pass;
    }
};

int main(){
   test x(3);
   test y(2);
   test z[2]={x,y};
   y.number = 1;
   cout << "z[0].number: " << z[0].number << endl;
   cout << "z[1].number: " << z[1].number << endl;
   cout << "x.number: " << x.number << endl;
   cout << "y.number: " << y.number << endl;
   return 0;
}

この出力を考え出すと、

z[0].number: 3
z[1].number: 2
x.number: 3
y.number: 1

これの代わりに、

z[0].number: 3
z[1].number: 1
x.number: 3
y.number: 1

2番目の出力を可能にするにはどうすればよいですか? これを3日間検索しましたが、まだ運がありません:(

4

6 に答える 6

21

あなたが言う時:

test z[2] = {x, y};

zの 2 つのコピー構築インスタンスを保持しますtest。コピー コンストラクターを配置しなかったため、すべてのデータ メンバーをコピーする既定値が使用されます。したがって、のコピーと のzコピーが含まれます。そのため、変更しても の内容は変更されません。すべてが参照である Java とは異なります。xyyz

于 2013-05-14T19:58:13.563 に答える
7

私は最初に「オブジェクトへの参照zの配列を作成できます」と書きました。test

test &z[2] = {x,y};  // Wrong, wrong, wrong!

...しかし、私が今気づいたように、C++ では参照の配列を直接許可していないため、それほど単純ではありません。

@chris がコメントしているように、C++11 では usingstd::reference_wrapperはこの制限を回避します。

std::reference_wrapper<test> z[2] = {x,y};
于 2013-05-14T19:59:27.767 に答える
1

C++ では参照の配列を使用できませんが、次のような場合std::reference_wrapperに役立ちます。

#include <vector>
#include <functional>
#include <iostream>

int main()
{
    test x(1), y(2);

    std::vector<std::reference_wrapper<test>> z{ std::ref(x), std::ref(y) };

    x.number = 5;
    y.number = 3;

    std::cout << z[0].get().number << std::endl; // 5
    std::cout << z[1].get().number << std::endl; // 3
}

ライブデモ

この例std::vectorでは、C スタイルの配列の代わりに推奨される も使用します。

于 2013-05-14T20:16:40.513 に答える
1

z[1] と y は同じオブジェクトではありません。あなたが行ったことは、y の現在の値からコピー初期化された z[1] です。

動作が必要な場合は、次のように明示的にポインター型を使用する必要があります (c++ では参照の配列は許可されません)。

class test{
    public:
    int number;
    test(int pass){
      number = pass;
    }
};

int main(){
   test x(3);
   test y(2);
   test *z[2]={&x,&y};
   y.number = 1;
   cout << "z[0]->number: " << z[0]->number << endl;
   cout << "z[1]->number: " << z[1]->number << endl;
   cout << "x.number: " << x.number << endl;
   cout << "y.number: " << y.number << endl;
   return 0;
}
于 2013-05-14T19:59:53.900 に答える
0

変数z[1]は のコピーでありy、 への参照ではありませんy。したがって、配列を初期化した後、またはzの変更はxまたはyの値に影響しません。z[0]z[1]

于 2013-05-14T20:00:02.293 に答える