我有一个函数A(),它返回一个指向对象的指针。在函数B()中,我尝试以下列方式更改该对象的成员:
void B()
{
ObjType o = *getObj();
o.set("abc");
}
对象o存储在一个数组中,当我打印成员的值时,似乎什么都没发生,并且该成员仍然具有旧值;
解决方案非常简单:
void B()
{
ObjType * o = getObj();
o->set("abc");
}
这确实有效。但对我来说,这与第一个样本完全相同。谁能解释一下呢?
答案 0 :(得分:9)
以下行很可能是复制对象:
ObjType o = *getObj();
这就是没有任何反应的原因。如果您不想使用第二个代码段中显示的指针,则可以使用如下引用:
ObjType& o = *getObj();
o.set("abc");
答案 1 :(得分:4)
第一个创建对象的副本。第二个创建指向它的指针。在第一种情况下,您正在修改副本。
答案 2 :(得分:3)
当然不一样。第一个将返回指针指向的对象复制到堆栈中的本地对象,然后修改副本。
第二个保留指向返回对象的指针,并通过指针修改它,从而改变原始对象。
第三种解决方案是使用参考文献。
答案 3 :(得分:2)
两者截然不同:
ObjType o = *getObj();
创建一个名为o
的对象的新副本 ObjType * o = getObj();
创建一个名为o的指针,指向现有副本 - 没有创建新对象