为什么更改指针的引用不会更改其原始值?

时间:2019-06-24 19:32:03

标签: c++ pointers

我觉得我错过了一些有关引用和指针的关键概念;我有这样的代码

#include "stdio.h"
struct bar {};
class foo {
  public:
    foo(){
      barPtr = new bar();
    };
    bar* barPtr;

    bar*& getBarPtr() {
      return barPtr;
    };

};

int main() {
  foo fObject;
  bar* b = nullptr;

  b = fObject.getBarPtr();
  printf("B before updates %p\n", b);
  printf("barPtr before b updates %p\n", fObject.barPtr);

  b = new bar();
  printf("B after updates %p\n", b);
  printf("barPtr after b updates %p\n", fObject.barPtr);
  return 0;
}

输出为

b before updates 0x55db559ace70
barPtr before b updates 0x55db559ace70
b after updates 0x55db559ad2a0
barPtr after b updates 0x55db559ace70

我想要实现的是通过使用barPtr来更改b指向的内容,因此我使getBarPtr函数返回了barPtr的引用。我不明白的是为什么更改b不会更改barPtr

3 个答案:

答案 0 :(得分:4)

b的定义更改为:

bar*& b = fObject.getBarPtr();

您当前正在做的是将fObject的指针复制到b中:它们是两个独立的对象。它们具有相同的值(指向您在bar的构造函数中创建的foo对象的地址),但是它们彼此无关。因此,如果您为b分配一个新值,则将覆盖它,而不会更改fObject的{​​{1}}。

答案 1 :(得分:0)

bbarPtr是指向内存中同一对象的两个指针。一旦为b分配了新值,就意味着它将指向另一个对象-如您所见,它不会接受barPtr

如果您修改了对象本身(例如,进行了barPtr->modifyMyData()之类的操作),那么您将从两个指针中看到修改后的值。

答案 2 :(得分:0)

您为什么认为通过更改指针变量b来更改类实例? 您不会以这种方式更改它。

您分配了两个不同的指针变量,一个在foo类中,一个在外部:b;

您可以使用指向指针的指针。并将引用返回给类的指针,然后更改该引用的内容。

相关问题