C++ 解引用运算符和函数的问题

C++ 解引用运算符和函数的问题,c++,pointers,C++,Pointers,我有一个函数a(),它返回指向对象的指针。在函数B()中,我尝试通过以下方式更改该对象的成员: void B() { ObjType o = *getObj(); o.set("abc"); } 对象o存储在一个数组中,当我打印成员的值时,似乎什么都没有发生,并且该成员仍然具有旧值 解决方案非常简单: void B() { ObjType * o = getObj(); o->set("abc"); } 这确实有效。但对我来说,这与第一个样本完全相同。有

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

void B()
{
    ObjType o = *getObj();
    o.set("abc");
}
对象o存储在一个数组中,当我打印成员的值时,似乎什么都没有发生,并且该成员仍然具有旧值

解决方案非常简单:

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

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

第一个创建了对象的副本。第二个创建指向它的指针。在第一种情况下,您正在修改副本。

下一行很可能正在复制对象:

ObjType o = *getObj();
这就是为什么什么都没发生。如果不想使用第二个代码段中所示的指针,可以使用如下引用:

ObjType& o = *getObj();
o.set("abc");

当然不一样了。第一个将返回指针指向的对象复制到堆栈上的本地对象中,然后修改副本

第二个保留指向返回对象的指针,并通过指针修改该指针,从而更改原始对象


第三种解决方案是使用引用。

这两种方法完全不同:

   ObjType o = *getObj();
创建名为o的对象的新副本

   ObjType * o = getObj();

创建一个名为o的接口,该接口指向一个现有的副本-没有创建新对象

好的,但是你能解释为什么它会创建一个副本吗?当你写“Objttype o”时,你要求编译器创建一个新对象,而不是一个引用或指针。它分配存储并调用复制构造函数。