当类的指针被赋值为NULL时,类的哪些成员还可以被该指针调用

来源:互联网 发布:java 截断字符串 编辑:程序博客网 时间:2024/05/17 06:58

该问题源自于一道面试题,题目如下所示:

看如下代码,请问能不能编译通过?如果能编译通过能不能运行成功?并说明原因

class test{public:int fun(){return 1;};};int main (){test *t = NULL;int res = t->fun();return 0;}

好的,我们现在先来分析这道题目,初一看,该代码应该可以编译通过,但是运行肯定不会过,因为t是NULL了嘛,怎么还能再调用成员函数呢。

现在我们把这段代码贴到VS里,编译,运行,断点,发现没报错,一切正常,res值为1...

好神奇!

通过查找一些资料,我发现:

因为函数在类里面是独立于类存在的,而且不占用类的空间,在程序编译的时候就已经把函数的地址分配好了,因此,只要有这么一个对象,不管他指向NULL还是非NULL,都是可以调用该函数的,也不会出错。

那好,既然这样,我们再来看下面这段代码:

class test{public:test() {m_num = 0;};int fun1() {return 1;};static int fun2() {return 2;};virtual int fun3() {return 3;};int fun4() { return m_num;};private:int m_num;};int main (){test *t = NULL;int res1 = t->fun1();int res2 = t->fun2();int res3 = t->fun3();int res4 = t->fun4();return 0;}
放到编译器中,fun1,fun2可以正常运行,fun3,fun4运行出错,这又是为什么呢?

fun1上面已经分析过了,可以运行没问题;

fun2是静态函数,本身就不属于类,所以跟类的指针没有关系,可以运行,也没有问题;

fun3是虚函数,而虚函数是通过虚函数表来实现的,而虚函数表是存在于对象中的,对象为NULL了,自然就无法访问了;

fun4是调用了类的成员变量,而成员变量也同样是存在于类的对象中的,为NULL的的对象没有了成员变量的存储空间,也无法访问。

以上是对该问题相对表层的分析,要想进一步了解该问题,建议看一下关于“__thiscall”的解释,可以参考如下博文:

http://blog.csdn.net/yc_8301/article/details/1814744

我也会在后续的文章中专门对该问题做一个分析,敬请关注。

0 0
原创粉丝点击