为什么指针为NULL还能调用成员函数?
来源:互联网 发布:windows phone8评测 编辑:程序博客网 时间:2024/05/22 05:00
以上程序中,下列哪个函数调用会有问题()
A、b->FunctionD();
B、b->FunctionB();
C、b->FunctionA();
D、b->FunctionC();
要理解这个的话。。。成员函数其实可以认为是一个普通的函数,比如
2
3
4class A{
public:
void func(int x) { cout<<"hello, A. x="<<x<<endl; }
};
在编译器看来,大概就长这个样子吧:
你平时使用成员函数的时候,大概就是这样的:
2A a;
a.func(2);
其实在编译器看来,是这个样子的:
如果这么说的话,也许你就理解了,为什么对象是NULL的时候还可以调成员函数:
2
3
4
5
6A *pa = NULL;
pa->func(2);
//在编译器看来就好像是 A_func(pa, 2);且pa==NULL
((A*)NULL)->func(2);
//在编译器看来就好像是 A_func( ((A*)NULL), 2);
-----我是分割线-----
上面的例子中func函数里并没有使用成员变量。考虑有成员变量并且在成员函数里使用的情况,就会不一样了:
2
3
4
5
6class A{
private:
int y;
public:
void func(int x) { y = x; }
};
注意此时y是成员变量,编译器会自动给它加上this->,也就是
此时正常的情况就不用说了,说说用NULL对象指针调用成员函数的情况:
2
3
4
5
6
7
8A *pa = NULL;
pa->func(2);
//在编译器看来就好像是 A_func(pa, 2);且pa==NULL
((A*)NULL)->func(2);
//在编译器看来就好像是 A_func( ((A*)NULL), 2);
//好吧我承认这段代码跟上面的一毛一样啦!
此时程序会崩溃!为什么?因为this指针是NULL,而你访问了它的y变量!
----又是我哈哈哈-----
结论:
- 通过对象调用成员函数,对象的指针会被传入函数中,指针名称为this
- 因此NULL对象指针也可以调用成员函数
- NULL对象指针调用成员函数时,只要不访问此对象的成员变量,则程序正常运行
- NULL对象指针调用成员函数时,一旦访问此对象的成员变量,则程序崩溃
下面是我加的
同理,当在调用虚函数时,对于一个虚拟函数调用
如b->FunctionB();
将会被转化成 (*b->vptr[1])(b),vptr表示由编译器产生的指针,指向virtual table,而1是virtual table slot的索引值,关联到FunctionB函数,此时b为NULL,因此肯定无法访问,出现错误。
阅读全文
0 0
- 为什么指针为NULL还能调用成员函数?
- 对象指针为NULL,为什么还是可以调用成员函数
- 空指针为什么能调用成员函数?
- 空指针为什么能调用成员函数?
- 空指针为什么能调用成员函数?
- 空指针为什么能调用成员函数?(转载)
- 空指针为什么能调用成员函数?(转载)
- 当类的指针被赋值为NULL时,类的哪些成员还可以被该指针调用
- NULL指针调用成员函数的例子
- 空指针也能调用成员函数?
- 空指针也能调用成员函数?
- 为什么通过空指针(NULL)可以正确调用一些类的成员函数?
- 为什么通过空指针(NULL)可以正确调用一些类的成员函数?
- 为什么通过空指针(NULL)可以正确调用类的部分成员函数
- 为什么通过空指针(NULL)可以正确调用一些类的成员函数?
- C++ 通过null指针调用成员函数 正常
- 为什么Nullable<T>结构能为null
- 通过一个非法的指针或者NULL指针调用成员函数会发生什么?
- css inline-block 与 float的使用
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- hadoop配置HA简单总结
- 关于Autosar中的NM模块的理解
- 用EXCEL来解决同期比较的问题
- 为什么指针为NULL还能调用成员函数?
- 8月份英语总结博客——小黑屋
- Java获取apk / ipa应用信息的思考与实践
- vue开发过程中跨域最简单解决方案
- [python]如何删除目录下指定格式的文件
- 利用virsh和xml文件创建虚拟机
- 71. Simplify Path
- Tomcat 目录结构
- HDFS源码分析数据块校验之DataBlockScanner