空指针也能调用成员函数?

    最近各大公司都在招聘实习生,昨晚,微信公众号推送了网易的笔试题让小伙伴们参考,看了第一道题,博主就觉得“嗯,我果然还是见识短哈!”为什么呢,我们先看看这个代码~

class cal
{
public:
	void show()
	{
		cout << "cal::Show()" << endl;
	}

};
int main()
{
	cal *pcal = NULL;
	pcal->show();
	getchar();
	return 0;
}
#endif

Q;该程序输出的结果什么?

博主毫不犹豫的选择了“运行时崩溃”这个选项

然而。。。。真正的答案却是这个指针可以正确的调用show()函数。。what?!why?!这不科学

怀着对科学严谨的态度(我要吐了)B_0061.gif,博主还是去别的大大的博客转了一圈。诶!?还真被我找到了,这到底是为什么呢?

我们现在再看一段代码!

class cal
{
public:
	cal() :a(10)
	{}
	void display()
	{
		cout << a << endl;
	}
private:
	int a;
};
int main()
{
	cal *pcal = NULL;
	pcal->display();
	getchar();
	return 0;
}
#endif

和上面的那段代码很像吧,但是呢,这段代码在运行的时候是会崩溃的,为什么呢!?

    仔细的你发现了没,上面第一段代码里,指针调用的函数没有用到this指针,而这一段里用到了,所以关键就在于你是否用到了this指针。

    这是因为,我们在编写一个类的时候,它的所有的对象共用了成员函数,所以在编译期间我们就已经确定了成员函数的地址,而类又依靠this指针来区分各个不同的对象以便于找到正确的数据。对于第一个例子,它的this指针就等于NULL而show()是一个静态类型的成员函数,在调用时不会传this指针给它,所以我们可以顺利的调用它,但是第二个例子中我们用到了类的数据a在调用时被编译器解释为this->a ,但是你得this是NULL啊,你指什么啊!?

    所以,你明白了吗。。。

本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1755456

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值