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

xiaoxiao2021-02-27  170

C++中使用空对象指针调用成员函数转载自:http://blog.csdn.net/primeprime/article/details/50726918

C++中,空指针是不能够使用的,然后空对象指针有时候却能够调用成员函数。

    下面定义一个简单的类:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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的调用也就会出错了。

转载请注明原文地址: https://www.6miu.com/read-16359.html

最新回复(0)