今天下午突然接到了思科打来的面试电话,毫无预兆,自己也没有心理准备。对方开始先问我现在方不方便做一个简短的面试(整个电面过程不超过15分钟,真的够简短了……),其实当时我完全可以跟对方说不方便,再约个时间的,但是既然都打来了,也想测试一下自己的在无准备情况下的应急能力,就跟对方说可以面试了。问题都不难,都是一些基础的问题,可能看我简历上写的都是C++和C#的,然后面试官可能也没怎么用过C#吧,就多数都是问我C++,不过真的都不难。过程中没有问过算法题,这点我比较郁闷,因为思科做路由器交换机这些的,而他问到我这些的时候,我基本都不懂,如果问我一些算法题说不定还能加些分呢。过程中的题目都不难,但是答得不太好,感觉都没说到重点上,也因为是电话面试,看不到面试官在听了我的答案后的反映,不知道是不是满意了。不过面了这么短时间,估计机会不大。下面回忆下今天问到的一些问题吧,也当作是积累。
1、说说C++和C#的区别
语言性质:
C#是一种完全面向对象的语言,而C++不是,C#是基于IL中间语言和.Net Framework CLR的,在可移植性、可维护性和强壮性方面都比C++有很大的改进(这点我觉得在目前来说没有什么实际意义,因为目前为止,微软都好像没有推出基于除Windows以外的.net framework,C#也一直只能在Windows平台上使用)
开发效率:
C#的设计目标是用来开发快速稳定可扩展的应用程序,当然也可以通过Interop和Pinvoke来完成一些底层操作,但是对于一些和底层系统相关很密切的程序(比如驱动程序),还是C++有优势。
委派构造函数:
C++不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数),而C#则允许。委派构造函数调用语法上非常自然易懂,事实上,C++不提供这一特性并不是出于语法上的考虑,而是出于资源管理的考虑。C++的构造函数用于分配资源,而析构函数用于释放资源,构造函数和析构函数调用必须匹配,否则就打破了C++的基本规则。如果允许委派构造函数调用,则会打破这一规则——构造函数被执行两次,而析构函数只执行一次。
虚函数的调用规则:
C++在构造函数中,虚函数的调用会被编译器自动转为普通函数调用,而在C#构造函数中允许进行虚函数的调用。C++这样处理自然有它的原因,在C++中,构造函数执行完成后对象才初始化,对于多态来说,也就意味着构造函数在背后执行了很重要的一件事情——初始化对象的虚函数表。如果我们在基类的构造函数中调用虚函数,则因为此时对象的虚函数表仍旧是基类的虚函数表,所以无法进行正确的虚函数调用。而在C#中,在对象的构造函数执行之前对象的类型信息已经初始化好了,所以可以进行正常的虚函数调用。
2、你觉得C#中有什么功能或者特性可以移植到C++中
这个问题是开放性的,我当时也没答好,平常没思考过的话,在面试这么紧张的环境下要能自圆其说也是很难的,大家自己思考下吧,这个应该是要考察你的思维的。
3、C++虚函数的实现机制,为什么构造函数不能是虚函数?析构函数可以吗,如果可以,虚析构函数有什么作用?
这个问题也不是很难,可能考虑的比较少的就是为什么构造函数不能为虚函数,当时我就没回答出这个。
其实看了第一题的答案,多多少少也能说出点了,构造函数就是用来初始化虚函数表的,既然是用与初始化虚函数表,自己又怎么可能是虚函数呢。
接着我们从虚函数的调用规则方面分析,虚函数的调用是“向前”和“向外”进行的,它能调用在派生类中的函数,而派生类中的函数有可能会访问基类的成员。加入构造函数可以为虚函数,那么我们调用的函数就可能操作还没有被初始化的成员(调用了派生类的构造函数,操作基类成员,但是基类的构造函数并没运行,成员没被初始化!),这将是异常灾难!
后面的问题都不是很难,真的都是很基础很基础的东西,期间有些linux的问题,但是本人确实缺乏这方面的经验,一直以来都是在Windows平台上做开发的(.Net),所以可能给扣了不少分
4、什么是深拷贝和浅拷贝
5、TCP和UDP的区别
最后,面试官让我讲讲自己的项目经历,讲完以后也没就我的项目问相关的问题,估计是觉得我做的没什么亮点,没什么可问的吧。整个面试过程就这样结束了,大约15至20分钟。总结起来,面试还是有准备的好,以后收到那种突击型的电话面试,还是精明点说当时不方便,要求再约时间。这样可以让自己做下针对性的准备。...查看更多
包含1个问题,0个回答
Q:你觉得C#中有什么功能或者特性可以移植到C++中
C++虚函数的实现机制,为什么构造函数不能是虚函数?析构函数可以吗,如果可以,虚析构函数有什么作用?