C++尚未构造对象的调用方法

C++ call method of not yet constructed object

本文关键字:调用 方法 对象 C++      更新时间:2023-10-16

上次我被否决了,所以我试图让我的问题更清楚。这是代码:

my_header.h

class A;
class B {
public:
  B(A* a);
  int GetValue() { return value_; }
private:
  int value_;
};
class A {
public:
  A() {
   b = new B(this);
  }
  void PrintValue() {
    std::cout <<  "GetValue() called from A::PrintValue() = " << b->GetValue() << "n";
  }
private:
  B* b;
};
B::B(A* a) : value_(100) {
  std::cout << "GetValue() called from B::B(A* a) = " << GetValue() << "n";
  a->PrintValue();
}

和 main.cc

    #include "my_header.h"
    int main() {
      A a;
      return 0;
    }

输出是:

GetValue() called from B::B(A* a) = 100
GetValue() called from A::PrintValue() = 1

我知道调用尚未正确构造的对象的方法是一个非常糟糕的主意。但是我不明白为什么从PrintValue()返回 1 value_中调用GetValue()即使它已经初始化为 100,正如我们从上面的字符串中看到的那样。

>A::b直到B的构造函数完成后才会设置为新B对象的地址。

B的构造函数调用a->PrintValue()时,后者在b尚未初始化时调用b->GetValue()。因此,您可以通过访问b获得未定义的行为。

未定义的行为意味着任何事情都可能发生。正如您所说,A对象尚未构造,因此使用指向A对象稍后将位于何处的指针调用PrintValue会产生废话。不要试图推理它。只是不要这样做。

你乞求和乞求未定义的行为,这就是编译器给你的。 A 未完全构造。 特别是,b尚未分配,也没有初始化为任何特定内容。 您的程序可能会执行任何操作。