空指针也能调用成员函数?
2016-07-04 20:30
267 查看
一、问题简介
昨晚,微信公众号推送了网易的笔试题让小伙伴们参考,看了第一道题,博主就觉得“嗯,我果然还是见识短哈!”为什么呢,我们先看看这个代码~
class cal
{
public:
void show()
{
cout << "cal::Show()" << endl;
}
};
int main()
{
cal *pcal = NULL;
pcal->show();
getchar();
return 0;
}Q;该程序输出的结果什么?
博主毫不犹豫的选择了“运行时崩溃”这个选项
然而。。。。真正的答案却是这个指针可以正确的调用show()函数。。what?!why?!这不科学
怀着对科学严谨的态度(我要吐了)
,博主还是去别的大大的博客转了一圈。诶!?还真被我找到了,这到底是为什么呢?
我们现在再看一段代码!
和上面的那段代码很像吧,但是呢,这段代码在运行的时候是会崩溃的,为什么呢!?
仔细的你发现了没,上面第一段代码里,指针调用的函数没有用到this指针,而这一段里用到了,所以关键就在于你是否用到了this指针。
这是因为,我们在编写一个类的时候,它的所有的对象共用了成员函数,所以在编译期间我们就已经确定了成员函数的地址,而类又依靠this指针来区分各个不同的对象以便于找到正确的数据。对于第一个例子,它的this指针就等于NULL而show()是一个静态类型的成员函数,在调用时不会传this指针给它,所以我们可以顺利的调用它,但是第二个例子中我们用到了类的数据a在调用时被编译器解释为this->a ,但是你得this是NULL啊,你指什么啊!?
所以,你明白了吗。。。
二、总结
昨晚,微信公众号推送了网易的笔试题让小伙伴们参考,看了第一道题,博主就觉得“嗯,我果然还是见识短哈!”为什么呢,我们先看看这个代码~
class cal
{
public:
void show()
{
cout << "cal::Show()" << endl;
}
};
int main()
{
cal *pcal = NULL;
pcal->show();
getchar();
return 0;
}Q;该程序输出的结果什么?
博主毫不犹豫的选择了“运行时崩溃”这个选项
然而。。。。真正的答案却是这个指针可以正确的调用show()函数。。what?!why?!这不科学
怀着对科学严谨的态度(我要吐了)
,博主还是去别的大大的博客转了一圈。诶!?还真被我找到了,这到底是为什么呢?
我们现在再看一段代码!
class cal { public: cal() :a(10) {} void display() { cout << a << endl; } private: int a; }; int main() { cal *pcal = NULL; pcal->display(); getchar(); return 0; }
和上面的那段代码很像吧,但是呢,这段代码在运行的时候是会崩溃的,为什么呢!?
仔细的你发现了没,上面第一段代码里,指针调用的函数没有用到this指针,而这一段里用到了,所以关键就在于你是否用到了this指针。
这是因为,我们在编写一个类的时候,它的所有的对象共用了成员函数,所以在编译期间我们就已经确定了成员函数的地址,而类又依靠this指针来区分各个不同的对象以便于找到正确的数据。对于第一个例子,它的this指针就等于NULL而show()是一个静态类型的成员函数,在调用时不会传this指针给它,所以我们可以顺利的调用它,但是第二个例子中我们用到了类的数据a在调用时被编译器解释为this->a ,但是你得this是NULL啊,你指什么啊!?
所以,你明白了吗。。。
二、总结
相关文章推荐
- 学习笔记:树分治
- 关于mysql函数GROUP_CONCAT
- Javascript 基本-1
- Java易混淆概念与重点知识积累 第三篇
- 走进Java
- 【CSS3】transform变形--慕课网【学习总结】
- UIWebview基本使用(原生加载框UIActivityIndicatorView)
- Centos下QEMU安装
- linux多线程信号处理
- springMVC + ProgressListener + CommonsMultipartResolver 上传进度查询
- windows下mysql忘记root密码的解决办法
- 使用Perl5获取有道词典释义
- Cassandra查询出错
- eclipse adt 选择ndk目录时不识别,出现“Not a valid NDK directory”
- 【优化软件】对优化软件的一些理解
- W3AF FuzzableRequest 处理流程札记
- Construct vector (构建vector)
- paper 80 :目标检测的图像特征提取之(一)HOG特征
- php命名空间
- android sudio 打包资料汇总