提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、结论
- 二、类类型的空指针为什么不能访问类中成员变量?
- 三、类类型的空指针为什么可以访问类中成员函数?
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、结论
先说结论吧。
类类型的空指针不能访问类中成员变量。
类类型的空指针可以访问类中成员函数,但要求访问的成员函数内不能涉及对类中成员变量的访问。
话不多说,先上代码。
情景一:空指针访问类中成员变量
情景二:空指针访问类中成员函数
由程序执行结果可以看出,空指针在访问类中成员变量时导致了程序崩溃,但是却成功调用了类中成员函数。
第一个情景的输出结果还好说,就是可能有些同学在看到第二个情景的输出结果时就想不明白了,p不是个空指针吗,怎么能进行解引用的操作呢?
不瞒大家,其实我在第一次看到情景二的输出结果时也很是懵逼,也有同样的困惑。
不过没关系,接下来就让我们一起来探讨一下其中的原理。
二、类类型的空指针为什么不能访问类中成员变量?
这个问题很好解释。
因为空指针没有具体的指向对象,自然也就无法访问对象中的成员了。
那么问题来了,既然空指针没有具体的指向对象,那么他是如何能够访问类中成员函数的呢?
这就归咎于类的对象的存储方式了。
三、类类型的空指针为什么可以访问类中成员函数?
要解决这个问题,首先要了解类的对象的存储方式。
我们知道,类的成员包括成员变量和成员函数。前者又称为类的属性,后者则又称为类的方法。
对于同一类的不同对象来说,他们的成员变量自然不同,而行为确是相同的,都是执行同样的操作。这一点很好理解。
所以计算机在存储对象时,每个对象中存放各自的成员变量无可厚非,但每个对象中都存放一套相同的成员函数却是没有必要的。这些成员函数就好比于小区中的公共健身设施,同样的器材可以共不同的人使用,也没有必要每家都搞一套。如果在每个对象中都存放一套成员函数,这对空间的消耗是非常巨大的,因为函数也和变量一样需要占用空间。
科学家在设计类和对象时就考虑到这个问题,并提供了解决方案,也就是现在计算机中类的对象的存储方式:
计算机在存储对象时,每个对象中只存放各自的成员变量,而将成员函数放到公共的代码段,使得每个对象都可以使用同一组成员函数。
至于这些对象们是怎么能够在代码段准确找到属于自己的成员函数,而不会出现A类型的对象匹配到B类型的成员函数的情况,很遗憾的告诉大家,我也不知道。因为笔者也还处于学习阶段,目前也不懂更深层次的底层原理(希望有懂得这方面原理的大佬看到这篇文章后能在评论区里指点迷津,本篇文章有任何误人子弟的之处也请指正,拜谢)。
接下来我们通过代码来验证这条规则。
可以看到,Date类中有两个成员,一个是整型 变量_day,另一个是成员函数print。
我们知道,函数在存储时是以地址的形式进行存储,而函数名同时也是函数指针。
而任何指针在32位系统下的大小都是4个字节,在64位系统下的大小都是8个字节。
由程序输出的结果是4个字节而不是8个字节或12个字节就可以证实计算机中类的对象中只存储了成员变量而没有存储成员函数。
好了,了解了计算机中类的对象的存储方式我们就可以回答这个问题了。
类类型的空指针为什么可以访问类中成员函数呢?
原因就在于,不管我们通过对象去访问成员函数还是以类类型的指针的形式去访问成员函数,
实际上都不会进到对象内部去寻找成员函数,因为成员函数根本就没有存放在对象内部。
也就意味着我们以类类型的指针的形式去访问成员函数时压根就没有进行解引用的操作,
也就不会出现空指针的解引用的情况。
而成员函数是在公共的代码段被找到且被调用的。
那么问题又来了,既然成员函数不是在对象内部被调用,那为什么调用时还要在前面加个对象或类类型的指针呢?
笔者认为,原因有二。
一是被调用的函数始终是一个成员函数,需要指定其归属才能实现其调用,使用时在前面加个对象或类类型的指针实际上就指定了被调用函数的归属。
二是传参的需要,因为成员函数内大多涉及到对象中成员变量的操作。相信大家已经学过类和对象了对this指针应该也都不陌生了,我就不多介绍了。
不过还有一个需要注意的地方,通过类类型的空指针对成员函数进行调用时,被调用的函数中不能涉及对成员变量的操作,否则会出现this指针为空而引起空指针解引用的情况。
以上代码在调试时引发错误,就是因为print函数内的this指针接收了空指针的值后this指针就成了空指针。
由于空指针无法访问类中的成员变量,故此处执行出错。
我们把代码稍微修改一下。
从执行结果可以看到,print1函数和print2函数都被调用成功了,说明printf1函数中的this指针为空却还是调用了print2函数。
这就说明this指针可以为空,且再一次说明空指针可以访问类的成员函数,但要求成员函数中不能涉及对类中成员变量的访问。
到此,类类型的空指针能否访问类中成员的这个问题就算解释的差不多了,主要是以我目前的水平也就只能解释到这了,有说错的地方欢迎大家在评论区指正,还请大家不吝赐教。
总结
类类型的空指针不能访问类中成员变量。
类类型的空指针可以访问类中成员函数,但要求访问的成员函数内不能涉及对类中成员变量的访问。
计算机在存储对象时,每个对象中只存放各自的成员变量,而将成员函数放到公共的代码段,使得每个对象都可以使用同一组成员函数。
通过类类型的空指针对成员函数进行调用时,被调用的函数中不能涉及对成员变量的操作,否则会出现this指针为空而引起空指针解引用的情况。
this指针可以为空。