C++里为什么空指针也能调用函数成员?

#include <iostream>
using namespace std;

class A{
public:
    void f(){ cout<<this<<endl; }
};

int main()
{
    A *a = nullptr;
    a->f();
    
    return 0;
} 

程序输出:

0

为什么 a->f() 这种空指针调用成员函数是允许的?它的机制是什么?

阅读 2.7k
3 个回答

类实例 a 当然可以调用它的公开成员函数 a->f(),这是类函数的调用方式,跟 a 是不是空指针无关。

nullptr -> f() 会不会崩溃,取决于 f() 是否依赖类实例相关属性,举例

#include <iostream>
using namespace std;

class A
{
public:
    void f1()  { cout << "A::f1(): " << this << endl; }
    virtual void f2()  { cout << "A::f2(): " << this << endl; }
    void f3()  { cout << "A::f3(): " << this->n << endl; }
    static void f4()  { cout << "A::f4(): " << endl; }

private:
    int n;
};

int main()
{
    A* a = nullptr;
    a->f1();  // OK
    // a->f2();  // FAIL
    // a->f3();  // FAIL
    a->f4();  // OK

    return 0;
}

编译时,成员函数和普通函数相比只是多传递一个this指针,只要成员函数的操作没有隐含的对this指针的解引用,就没问题。

不允许。

这是未定义行为。任何事情都可能发生。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题