一个C++面试题目

在我还以一个C++程序员自居的时候,面试别的C++程序员我经常问一道问题是这样的,考虑在不同情况下,下面这段代码的执行情况

class A;

int main()
{
	A* a = 0;
	a->func();
	
	return 0;
}

我不记得这个题目的出处了,就当是我自己原创的吧;这个题目的通过率不是特别高,在我面试过的初级程序员中,可能一半都不到。相对来说,我还是一个比较nice的考官,首先表现在我不以最终答案作为判定结果,如果有合理的分析过程,就算是最后答错了我也算通过,其次如果面试的人卡壳了,我也会给一些提示,给一些用例来分析;

然后答案是这样的

  • 如果func是个static函数,那么效果和调用A::func();是一样的,正常执行;
  • 如果func是个虚函数,会访问非法内存地址,一般会crash;
  • 如果func是非虚函数
    • 如果func函数不访问成员变量,正常执行
    • 如果func函数访问了成员变量,会访问非法内存地址,一般会crash;

这个题目的用意,首先是作为一个C++程序员,有必要能列举出同样叫做函数的,到底有多少种类型;其实无非也就是静态函数和成员函数,成员函数分虚函数和非虚函数;其次,虚函数和非虚函数的调用机制和效果;然后是类的成员变量怎么存储和访问。

静态函数可以用对象的指针来调用,这个我也是后来才知道,算是很苦的语法糖?我不知道C++这么设计的意图是什么,语法上更严谨的面向对象语言,比如Java和C#,都是不允许的。如果有大神能指导原因,不胜感激。在知道合理的原因之前,我会禁止这个写法。

我现在不太问这种编程语言细节的东西了,因为我想通了一件事,熟悉编程语言细节未必真的熟悉计算机科学,而熟悉计算机科学又未必能写好功能逻辑代码;我最终希望能找到的是一个能写好逻辑做好功能的人;这造成了我现在的困惑点,怎么判断来面试的人能写好逻辑呢?

原文地址:https://www.cnblogs.com/linnguo/p/5125403.html