这是一件简单的事情,我不确定它是否可以像其他语言一样在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?
}
答案 0 :(得分:5)
与C#不同,C ++不区分struct
和class
。实际上,这两个是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或其他一些值类型 - 这是预期的行为,但对于上课,......
关键字class
和struct
可以互换使用。唯一的区别是,如果您没有指定默认的访问模式
是:
public
中struct
在private
class
那就是说,
someclass& my=moreofthem[1];
提供参考,这就是您正在寻找的内容。此处引用my
的作用类似于原始变量moreofthem[1]