C++中使用空对象指针调用成员函数
2015-07-21 00:00
309 查看
摘要: C++ 空对象指针 成员函数
C++中,空指针是不能够使用的,然后空对象指针有时候却能够调用成员函数。
下面定义一个简单的类:
空指针对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的调用也就会出错了。
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的调用也就会出错了。
相关文章推荐
- c++中string类成员函数c_str()的用法
- 指向类成员函数的指针其实并非指针
- js对象内部访问this修饰的成员函数示例
- 如何让C++类的成员函数作为回调函数
- 鸡啄米:C++编程入门系列之四十六(多态性:运算符重载为类的成员函数)
- 用 const 限定类的成员函数
- 关于C++中类的static和const成员
- C++中修改const成员变量
- 让C++回调函数可以同时支持成员函数和静态函数的方法
- 黑马程序员-反射的应用
- 内联函数 与 成员函数
- m_hWnd和this指针
- 【Effective C++】const的使用
- C++ primer 类 成员变量 成员函数 友元
- C++ - 成员函数(member function)模板(template) 详解 及 代码
- Python - 静态函数(staticmethod), 类函数(classmethod), 成员函数 区别(完全解析)
- C++ - 派生类访问模板化基类(templatized base class)的命名
- const成员函数
- 关于类成员函数中静态变量的一点提示
- 成员函数作为线程函数调用