一个非常愚蠢的问题,或者可能是我的概念疑问。
#include <iostream>
using namespace std;
class A
{
public:
void print()
{
cout<<"Printing\n";
}
};
int main()
{
A * a = NULL;
a->print();
return 0;
}
输出为:打印
a
指针(为NULL)如何能够访问A类的成员函数。
请解释......可能只是一个愚蠢的问题,但我的印象是NULL指针不会访问该类的成员函数。
答案 0 :(得分:6)
取消引用NULL
指针,就像在代码中一样,是未定义的行为。这种 undefinedness 的可能性之一是它可能正常工作。但它可能会在下一次崩溃,或做一些完全出乎意料的事情。
由于您未在成员函数this
中使用隐式print
参数,因此似乎NULL
指针永远不需要实际被取消引用。< / p>
答案 1 :(得分:5)
取消引用NULL
会导致未定义的行为(UB)。 UB并不意味着“必须崩溃”或“必须做一些奇怪的事情”。
答案 2 :(得分:2)
如上所述,是的,这是未定义的行为,但它起作用的原因是......
它是一个空指针,但仍然是定义类型“A”,每次创建类的实例时它都不复制方法,它只是分配ram并使用新分配的地址调用构造函数方法。
调用方法仍然有效,只要你的方法不使用任何类内部,你的方法不是,但是如果你确实需要这样的功能,你应该使用静态方法,而不是如果你试图编译器会抱怨访问'this'或任何类内部成员。
如果你破坏方法并检查'this'的值,你会发现它是NULL。