空指针可以调用成员函数?

有下面一个简单类:

class A
{
public:
    void fun(){
        cout << "I'm class A"<<endl;
    }
};

用一个空指针调用上面的fun函数:

A* pa = NULL;
pa->fun();

讲道理,空指针应当是”不可用”的,自然也不能调用其成员函数了,但是结果却出乎意料地正确执行了:
这里写图片描述

为什么??其实,关键在于每个成员函数的this指针。
其实,c++类的成员函数与传统c的函数并没有什么不同,只是成员函数的第1个参数必须是this指针,只是这个参数是由编译器自动加上去的,调用时也不需要显示传递。

所以,上面的class A的成员函数fun的本质其实是这样子的:

void fun(A* this){
        cout << "I'm class A"<<endl;
    }

而调用是其实这样子的:

A* pa = NULL;
fun(pa);

可以看到,虽然this指针实参为NULL,但是fun函数根本没有用到this指针啊,this在这里只是打了个酱油而已!

但是,如果在成员函数中使用的成员变量,就不可避免要使用到this指针,若是这样,就不可避免的出现崩溃了。

综上所述:即便对象指针为NULL,只要成员函数没有使用非静态成员函数,就可以正常调用该成员函数。


版权声明:本文为u010021282原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。