4

可能重复:
当我在 NULL 对象指针上调用成员函数时会发生什么?

class A {
  public:
    void foo() { cout << "Work";}
    void bar() { this->foo(); }//new edit, works too!
};

class B {
  private:
    A *a; //never initialized
  public:
    A& getA() {
      return *a;
    }
};

void SomeFunction() {
    B *b = new B();
    B& bRef = *b;
    bRef.getA().bar();//edited
    delete b;
}

我在没有初始化“a”的情况下调用了 SomeFunction(),它仍然正确打印“Work”。我不明白为什么,它应该因分段错误而退出!

4

3 回答 3

10

这是未定义的行为,但它可以在大多数编译器上工作,因为foo不是virtual,它不使用this指针。

于 2012-10-18T07:34:37.220 回答
5

请记住,类只是 C++ 的构造。编译后,所有类方法都只是接受隐藏this参数的静态方法。

鉴于您的foo()方法从不引用任何数据成员,它永远不需要使用它,因此尽管 this 的值未初始化,但运行良好。

于 2012-10-18T07:45:24.927 回答
3

语义上,

o.f(args)

是相同的

f(o, args)

因此,您可以认为您正在调用的函数 ( A::foo()) 等效于:

void A_foo(A* pthis)
{
    cout << "Work";
}

如您所见,pthis它永远不会被取消引用,因此不会发生无效的内存访问。即使您键入this->foo(),它也是完全相同的调用,this不需要取消引用。

至少,这是编译器实现它的一种常见方式。可能发生的具体情况尚未确定,因此在死亡站 9000 上运行代码可能会将一只小猫送入太空。想想小猫吧!

于 2012-10-18T07:59:02.377 回答