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】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

 

阅读剩余
THE END