[转]C++成员函数的编译

先看下面一段代码:
  1/*******************************************
  2 * Author: Leslie Wei
  3 * Created Time: 2012年04月22日 星期日 21时35分58秒
  4 * File Name: nullObj.cpp
  5 * Description:
  6 * @Copyright reserved
  7 ********************************************/
  8
  9 #include <stdio.h>
 10 class nullObj
 11 {
 12 public:
 13     void Print()
 14     {
 15         int a = 10;
 16         printf("a's value is %d\n", a);
 17     }
 18 };
 19
 20 int main(int argc, char *argv[])
 21 {
 22     nullObj *nobj = NULL;
 23     nobj->Print();
 24     return 0;
 25 }

觉得这段代码有问题吧?22行的nullObj为空,下面怎么能访问了空指针啊?这不是致命的空指针错误么?
别急,先去test下,你一定很惊讶,访问空指针程序居然能正确运行!
为 什么呢?对应到汇编代码中去看吧?编译器是怎么把C++类编译成汇编代码的呢?我们都知道,程序的函数定义最后是装载到内存的静态内存区的。也就是说不管 是C程序还是C++程序,经编译后的函数是没什么区别的,那么编译器怎么实现C++对对象的支持呢?其实编译器只是做了个很看似很简单的操作,就是在编译 C++函数的时候将C++的this指针传给了该函数,我们在创建一个对象的时候,会自动把创建的对象赋值给this指针,这里的nullObj *nobj = NULL;说明了this指针为空,但是Print()函数的定义是固化到代码区的,而Print函数中并没有访问this指针,所以即使这里的nobj 为空,函数一样能正确执行!
偶然发现了这个小问题,特此记录下来。

posted @ 2013-04-21 22:25  Lance.M  阅读(237)  评论(0编辑  收藏  举报