最近各大公司都在招聘实习生,昨晚,微信公众号推送了网易的笔试题让小伙伴们参考,看了第一道题,博主就以为“嗯,我果真仍是见识短哈!”为何呢,咱们先看看这个代码~
微信
class cal { public: void show() { cout << "cal::Show()" << endl; } }; int main() { cal *pcal = NULL; pcal->show(); getchar(); return 0; } #endif
Q;该程序输出的结果什么?ide
博主坚决果断的选择了“运行时崩溃”这个选项函数
然而。。。。真正的答案倒是这个指针能够正确的调用show()函数。。what?!why?!这不科学this
怀着对科学严谨的态度(我要吐了),博主仍是去别的大大的博客转了一圈。诶!?还真被我找到了,这究竟是为何呢?spa
咱们如今再看一段代码!指针
class cal { public: cal() :a(10) {} void display() { cout << a << endl; } private: int a; }; int main() { cal *pcal = NULL; pcal->display(); getchar(); return 0; } #endif
和上面的那段代码很像吧,可是呢,这段代码在运行的时候是会崩溃的,为何呢!?
对象
仔细的你发现了没,上面第一段代码里,指针调用的函数没有用到this指针,而这一段里用到了,因此关键就在于你是否用到了this指针。get
这是由于,咱们在编写一个类的时候,它的全部的对象共用了成员函数,因此在编译期间咱们就已经肯定了成员函数的地址,而类又依靠this指针来区分各个不一样的对象以便于找到正确的数据。对于第一个例子,它的this指针就等于NULL而show()是一个静态类型的成员函数,在调用时不会传this指针给它,因此咱们能够顺利的调用它,可是第二个例子中咱们用到了类的数据a在调用时被编译器解释为this->a ,可是你得this是NULL啊,你指什么啊!?编译器
因此,你明白了吗。。。
博客