C++中使用空对象指针调用成员函数

        C++中,空指针是不可以使用的,而后空对象指针有时候却可以调用成员函数。
        下面定义一个简单的类:函数

class TestCls
{
public:
    static void Test_Fun1(){ cout<<"Test_Fun1"<<endl; }
    void Test_Fun2(){ cout<<"Test_Fun2"<<endl; }
    void Test_Fun3(){ cout<<m_num<<endl; }
    virtual void Test_Fun4{ cout<<"Test_Fun4"<<endl; }
public:
    int m_num;
};
int main()
{
    TestCls* pTestCls = NULL;
    pTestCls->Test_Fun1();       //OK, print Test_Fun1
    pTestCls->Test_Fun2();       //OK, print Test_Fun2
    pTestCls->Test_Fun3();       //Error
    pTestCls->Test_Fun4();       //Error
}

           空指针对Test_Fun1和 Test_Fun2的调用正常,对Test_Fun3和Test_Fun4的调用会出错。下面具体    分析一下缘由:
           类的成员函数并不与具体对象绑定,全部的对象共用同一份成员函数体,当程序被编译后,成员函数的地址即已肯定,这份共有的成员函数体之因此可以把不一样对象的数据区分开来,靠的是隐式传递给成员函数的this指针,成员函数中对成员变量的访问都是转化成"this->数据成员"的方式。所以,从这一角度说,成员函数与普通函数同样,只是多了一个隐式参数,即指向对象的this指针。而类的静态成员函数只能访问静态成员变量,不能访问非静态成员变量,因此静态成员函数不须要指向对象的this指针做为隐式参数。
           有了上面的分析,就能够解释为何空对象指针对Test_Fun1, Test_Fun2的调用成功,对Test_Fun3  的调用不成功:
           Test_Fun1是静态成员函数,不须要this指针,因此即便pTestCls是空指针,也不影响对Test_Fun1的正常调用。
           Test_Fun2虽然须要传递隐式指针,可是函数体中并无使用到这个隐式指针,也就是说没有经过    这个隐式指针去使用非静态的成员变量,因此pTestCls为空也不影响对Test_Fun2的正常调用。
           Test_Fun3就不同了,由于函数中使用到了非静态的成员变量,对num的调用被转化成    this->num,也就是pTestCls->num,而pTestCls是空指针,所以pTestCls->num非法,对Test_Fun3的调用出错。
           Test_Fun4中并无使用非静态成员变量,为何调用也会出错呢,缘由在于Test_Fun4是虚函数,    有虚函数的类会有一个成员变量,即虚表指针,当调用虚函数时,会使用虚表指针,对虚表指针的使用也是经过隐式指针使用的,所以对Test_Fun4的调用也就会出错了。this

相关文章
相关标签/搜索