当修改数组中的类元素时,它的行为就像是副本而不是引用

时间:2016-07-13 13:02:05

标签: c++ reference

这是一件简单的事情,我不确定它是否可以像其他语言一样在C ++中使用。事物的行为就像它是一个副本,但不是同一个对象。我希望如果这是结构,或其他一些值类型 - 这将是预期的行为,但对于课堂,我希望这表现得像我在看"引用",即 - 与数组中的对象相同。我究竟做错了什么?

// Example program
#include <iostream>
#include <string>


class someclass
{
    public:        
    void setn(int n2);
    int n=10;
};

void someclass::setn(int n2){
    n=n2;
};


int main()
{
  someclass moreofthem[5];   
  someclass my=moreofthem[1];  
  std::cout << "start value: " << my.n << " as inital\n"; //10
  my.setn(2);  
  std::cout << "new value: " << my.n << " as expected\n"; //2
  std::cout << "value in list: " << moreofthem[1].n << " why?\n";  //10?

}

3 个答案:

答案 0 :(得分:5)

与C#不同,C ++不区分structclass。实际上,这两个是The Horror of Implicit Globals,并且遵循价值语义。

幸运的是,C ++还提供了引用和指针作为语言结构,使您可以处理对类和结构实例的引用:

 someclass moreofthem[5];   
 someclass& my = moreofthem[1];  
 //       ^
 //   That's it! Now you have yourself a reference
 std::cout << "start value: " << my.n << " as inital\n"; //10
 my.setn(2);

或者如果您更喜欢指针

 someclass moreofthem[5];   
 someclass* my = &moreofthem[1];  
 //       ^      ^
 //   declare and use a pointer; note -> below
 std::cout << "start value: " << my.n << " as inital\n"; //10
 my->setn(2);

与C#不同,class确保实例通过引用处理(代表C ++引用和C ++指针之间的混合)C ++允许您决定如何处理实例 - 按值,按引用,或者通过指针。该行为接近于为值类型的对象传递的C#ref参数,但它在所有上下文中都可用,包括实例和局部变量。这使您可以更灵活地通过引用或不同上下文中的值处理同一对象。

答案 1 :(得分:4)

这是因为对象my moreofthem[1]的副本,而不是参考。

如果你想要一个引用,你需要在定义变量时使用&符号:

someclass& my=moreofthem[1];  
//       ^
// Note ampersand here

答案 2 :(得分:3)

  

我希望如果这是struct或其他一些值类型 -   这是预期的行为,但对于上课,......

关键字classstruct可以互换使用。唯一的区别是,如果您没有指定默认的访问模式 是:

    public
  • structprivate
  • class

那就是说,

someclass& my=moreofthem[1]; 

提供参考,这就是您正在寻找的内容。此处引用my的作用类似于原始变量moreofthem[1]

的别名