1.28、空对象指针为什么能调用函数?
空对象指针能够调用成员函数的关键在于C++成员函数的底层实现机制:
- • 在C++中,非静态成员函数实际上是带有一个隐含参数的普通函数,这个隐含参数就是指向调用对象的
this
指针。编译器将成员函数转换为类似void func(ClassName* this)
的形式,调用时传入对象地址作为this
。 - • 当通过空指针调用成员函数时,函数本身的代码地址是确定且存在的,调用不会因为指针为空而失败。只有当函数内部访问了成员变量(即使用了
this
指针解引用)时,才会发生访问空指针导致的崩溃。 - • 如果成员函数没有访问任何非静态成员变量(即没有使用
this
指针指向的对象数据),那么即使this
是空指针,函数调用也不会触发非法内存访问,因而可以正常执行。例如打印一条固定信息的成员函数。 - • 静态成员函数本身不依赖任何对象实例,也没有
this
指针,因此无论是否通过空指针调用,都是安全的。 - • C++标准将通过空指针调用成员函数视为未定义行为,但编译器不会主动阻止这种调用,因为运行时检查会带来性能损失,且C++设计哲学强调效率和程序员责任。
总结来说
空对象指针能调用成员函数,是因为成员函数地址在编译时已确定,调用时传入的this
指针只是一个隐式参数,只有函数内部访问成员变量时才真正使用this
。如果函数不访问成员变量,空指针传入不会导致崩溃,函数调用得以正常执行。这体现了C++底层将成员函数实现为带this
参数的普通函数的机制。
面试中可以回答示例
空对象指针能调用成员函数,是因为C++成员函数在编译时被转成带隐式this
指针参数的普通函数。函数地址是固定的,调用时传入的this
指针只是一个隐式参数。如果函数内部不访问成员变量(即不解引用this
),即使this
为空指针,调用也不会崩溃。静态成员函数没有this
指针,调用时更不依赖对象实例,因此空指针调用安全。这个行为是C++语言设计和编译机制的结果,标准虽定义为空指针调用为未定义行为,但编译器不会限制这种调用以保证效率。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1266
文章版权归作者所有,未经允许请勿转载。
THE END