今天被问到如下问题:
CA *p = nullptr;
p->test();
会有什么结果。
实际上不同的成员函数会有不同的情况,经过测试如下:
#include <iostream>
class CA
{
public:
static void s_fun() {}
virtual void v_fun() {}
void fun1() {}
void fun2() { i = 2; }
private:
int i = 0;
};
int main()
{
CA *p = nullptr;
p->s_fun();
//p->v_fun(); // 崩溃
p->fun1();
//p->fun2(); // 崩溃
return 0;
}
解析:
-
函数若是静态成员函数时,由于没有使用到 this 指针,故不会崩溃。
-
函数若是虚函数时,由于需要通过 this 指针获取到虚函数表指针,这个过程中由于 this 为空,则崩溃。
-
函数是普通成员函数,由于该函数中没有使用 this,故不会崩溃。
-
函数是普通成员函数,若该函数中使用了 this,则崩溃。
总的来说,空的对象指针调用函数时,若调用过程或者函数内部使用了 this,则崩溃。
(SAW:Game Over!)