可能重复:
What will happen when I call a member function on a NULL object pointer?
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;
}
我调用了SomeFunction()而没有初始化“a”,它仍然正确打印“工作”。我不明白为什么,应该用分段故障拯救它!
答案 0 :(得分:10)
这是未定义的行为,但它适用于大多数编译器,因为foo
不是virtual
且它不使用this
指针。
答案 1 :(得分:5)
记住类只是C ++的一个构造。编译时,所有类方法都只是接受隐藏this
参数的静态方法。
鉴于您的foo()
方法从不引用任何数据成员,它永远不需要使用它,因此尽管没有初始值,但运行正常。
答案 2 :(得分:3)
从语义上讲,
o.f(args)
与
相同f(o, args)
因此,您可以将要调用的函数(A::foo()
)视为等同于:
void A_foo(A* pthis)
{
cout << "Work";
}
如您所见,pthis
永远不会被解除引用,因此不会发生无效的内存访问。即使您键入this->foo()
,它也是完全相同的调用,并且this
不需要取消引用。
至少,这是编译器实现它的一种常见方式。对于可能发生的事情,它是未定义的,因此在Death Station 9000上运行代码可能会将小猫射入太空。想想小猫!