为什么此功能打印4198400?我的理解是,由于Bar是Foo的孩子,它也有成员变量“a”,并且因为changeA(b)将a设置为6,所以它应该打印6.
#include <iostream>
using namespace std;
class Foo {
public:
int a;
};
class Bar: public Foo {
public:
int b;
};
Foo changeA(Foo f) {
f.a = 6;
return f;
}
int main() {
Bar b;
changeA(b);
cout << b.a << endl;
return 0;
}
答案 0 :(得分:1)
你似乎对此很新,所以我会试着看看能不能解释一下。可行的固定代码如下所示:
CHAR
你正在做的事情的问题是,当你将b传递给该函数时,它会传递它的副本。而您想要修改原始对象本身。为了详细说明,创建了一个b的副本并将其传递给该函数,该函数修改它并返回它。所以,如果你要做一个
#include <iostream>
using namespace std;
class Foo {
public:
int a;
};
class Bar: public Foo {
public:
int b;
};
Foo *changeA(Foo *f) {
f->a = 6;
return f;
}
int main() {
Bar *b = new Bar();
changeA(b);
cout << b->a << endl;
return 0;
}
a将具有您想要的修改值。但原始物体将保持不变。
当您将其作为指针传递时,您在changeA函数中所做的更改也将应用于原始b。使用引用(&amp;)也可以实现同样的目的,这将更容易:
Foo a = changeA(b);
在这里,你实际上做了一个改变,它将起作用,&符号的作用是确保你不创建副本并将其传递给函数,而是传递对象本身。所以这样,所有更改都是对原始对象本身进行的。
答案 1 :(得分:0)
如果您需要更改Bar b
内部changeA
功能的值,您可以做两件事
通过引用将现有实例(b)传递给changeA函数,并要求函数更改同一实例。
Foo changeA(Foo& f) {
f.a = 6;
}
int main() {
Bar b;
changeA(b);
return 0;
}
按值将现有实例传递给changeA
值,并要求函数返回已更改的实例。在这里,您必须将返回值保存在新实例中。
Foo changeA(Foo f) {
f.a = 6;
return f;
}
int main() {
Bar b;
Foo c = changeA(b);
cout << c.a << endl;
return 0;
}
但是,我喜欢第一种方式,因为它避免了创建额外的实例。