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

nek*_*tip 1 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?

}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

与C#不同,C++不区分a struct和a class.实际上,这两者是完全可互换的,并且遵循价值语义.

幸运的是,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);
Run Code Online (Sandbox Code Playgroud)

或者如果你更喜欢指针

 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);
Run Code Online (Sandbox Code Playgroud)

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