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

原创 2016年05月30日 13:35:16

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

空指针可以调用成员函数?

有下面一个简单类:class A { public: void fun(){ cout
  • u010021282
  • u010021282
  • 2016年12月24日 10:16
  • 399

浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?

http://blog.csdn.net/starlee/article/details/2062586    有下面的一个简单的类: class CNullPointCall ...
  • gzzheyi
  • gzzheyi
  • 2014年09月10日 21:26
  • 1081

空指针漏洞防护技术-初级篇

源文地址:http://www.panshy.com/articles/201508/security-2509.html 空指针漏洞防护技术 安全历史上由于空指针所带来的漏洞及攻击数不胜数,但由于...
  • yingzheng1983
  • yingzheng1983
  • 2015年08月05日 17:14
  • 1841

C++调用空指针对象的成员函数——静态绑定与动态绑定

最近代码中看到调用空指针对象的成员函数的写法,联想起上次碰到的问题:C++类的成员函数存储方式(是否属于类的对象)两者的本质是一样的,上次只是简单地讨论了下,这次从编译器的角度,来谈一谈这个知识点。一...
  • jiange_zh
  • jiange_zh
  • 2016年08月06日 13:31
  • 902

C++调用空指针对象的成员函数成功的理解

前言之前在与朋友聊天的时候说到C++中定义的空类对象指针(nullptr),也可以调用类的成员函数,不用进行具体的实例初始化。示范代码是这样的:class A{ public: static ...
  • m_buddy
  • m_buddy
  • 2017年09月07日 19:15
  • 337

什么情况下,空引用null调用方法不报空指针异常?

下面的代码,通过为null的引用调用静态方法,且并未产生异常。 public class Why { public static void test() { System.out.pri...
  • zilingkong
  • zilingkong
  • 2017年10月11日 11:27
  • 386

C++ 中“空引用”与“空指针”的区别

网络上有很多讨论C++ 的“引用”与“指针“的区别的文章,谈到区别,其中有一条:“引用不能为空(NULL),引用必须与合法的存储单元关联,指针则可以是NULL)”,但在实际应用中,有时候为了保持一致性...
  • luansxx
  • luansxx
  • 2013年08月21日 10:48
  • 11024

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

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

函数调用

C/C++函数调用过程分析 这里以一个简单的C语言代码为例,来分析函数调用过程 代码: 1 #include 2 3 int func(int param1 ,int ...
  • qq_28299831
  • qq_28299831
  • 2015年10月31日 21:29
  • 114

空指针为什么能调用成员函数?

举个简单的例子,假如有如下的一段代码: class MyClass { public:     int i;     void hello()     {         printf(...
  • wang73ying
  • wang73ying
  • 2014年03月04日 20:27
  • 375
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:空指针也能调用成员函数?
举报原因:
原因补充:

(最多只允许输入30个字)