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

如何使第二个输出成为可能?我已经搜索了三天,仍然没有运气:(

4

6 回答 6

21

当你说:

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

z拥有 的两个复制构造的实例test。由于您没有放入复制构造函数,因此它使用默认值,即复制所有数据成员。因此,z包含 的副本x和 的副本y。这就是为什么改变y不会改变z. 它不像 Java,一切都是参考。

于 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 回答
2

当您使用创建数组z时,test z[2]={x,y};实际上是在创建数组时的值的副本。从那时起,它们就是两组独立的值,即使您修改了一组,另一组仍然保持不变。xy

你可以做的是创建一个指向元素的指针数组(因为引用数组是不可能的):

test* z[2] = {&x,&y};
cout << "z[0]->number: " << z[0]->number << endl;
cout << "z[1]->number: " << z[1]->number << endl;

但是你可以初始化数组然后引用它吗?

test z[2]={3, 2};
test& x(test[0]);
test& y(test[1]);
于 2013-05-14T20:00:51.033 回答
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。因此,在初始化数组之后,对or的z任何修改都不会影响or的值。xyz[0]z[1]

于 2013-05-14T20:00:02.293 回答