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

when a class element from array is modified, it behaves like it is a copy, not reference

本文关键字:引用 副本 数组 修改 元素      更新时间:2023-10-16
这是

一件简单的事情,我不确定它是否像在其他语言中一样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 initaln"; //10
  my.setn(2);  
  std::cout << "new value: " << my.n << " as expectedn"; //2
  std::cout << "value in list: " << moreofthem[1].n << " why?n";  //10?
}

与 C# 不同,C++ 不区分structclass。事实上,这两者是完全可以互换的,并且遵循价值语义。

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

 someclass moreofthem[5];   
 someclass& my = moreofthem[1];  
 //       ^
 //   That's it! Now you have yourself a reference
 std::cout << "start value: " << my.n << " as initaln"; //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 initaln"; //10
 my->setn(2);

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

那是因为对象mymoreofthem[1]的副本,而不是引用。

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

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

我希望如果这是结构或其他值类型 - 这将是预期的行为,但对于课堂来说,...

关键字classstruct可以互换使用。唯一的区别是,如果您不指定访问修饰符,则默认将是:

  • public struct
  • class private

可是

someclass& my=moreofthem[1]; 

做一个参考,这就是你正在寻找的。在这里,引用my就像原始变量的别名moreofthem[1]