解除引用操作符和函数的问题

时间:2009-03-20 14:05:33

标签: c++ pointers

我有一个函数A(),它返回一个指向对象的指针。在函数B()中,我尝试以下列方式更改该对象的成员:

void B()
{
    ObjType o = *getObj();
    o.set("abc");
}

对象o存储在一个数组中,当我打印成员的值时,似乎什么都没发生,并且该成员仍然具有旧值;

解决方案非常简单:

void B()
{
    ObjType * o = getObj();
    o->set("abc");
}

这确实有效。但对我来说,这与第一个样本完全相同。谁能解释一下呢?

4 个答案:

答案 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的指针,指向现有副本 - 没有创建新对象