面经中高频知识点归纳(一)

网易面经知识点(C++/C研发)

注:由阅读大牛面经整理而成,夯实基础块!

1、多态性都有哪些?

C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:1)函数模板template <typename T>T max(const T& lsh, const T& rhs) {       return (lsh > rhs) ? lsh : rhs;}返回两个任意类型对象的最大值(对象),前提是该类型能够使用>运算符进行比较,并且返回值是bool类型。使用:int a = 3; int b = 4;cout << max(a, b) << endl;float c = 2.4; float d = 1.2;cout << max(c, d) << endl;输出结果为:         4                2.4这种绑定发生在编译期,这是由于模板的实例化是发生在编译期的,即在编译时编译器发现你调用max(a, b)时就自动生成一个函数int max(const int& lsh, const int& rhs) {       return (lsh > rhs) ? lsh : rhs;}即将所有的T替换成int;当你调用max(c, d)时就自动生成一个函数float max(const float& lsh, const float& rhs){        return (lsh > rhs) ? lsh : rhs;}之所以说开始的函数定义是函数模板,就是因为他就像个模子似的,你可以用铝作为原料也可以用石膏或者铜。2)函数重载:int max (int a, int b){     return (a > b) ? a : b;}int max (int a, int b, int c){     return max(max(a, b), c);}两个函数名称一样,参数类型或个数不完全相同,返回值一样(这个不重要)。使用:int a = 3, b = 4, c = 5;cout << max(a, b) << endl;cout << max(a, b, c) << endl;输出结果为:         4                5确定函数的过程也发生在编译器,当你使用max(a, b),编译器发现只有两个参数,那么就调用只有两个参数的函数版本,当使用max(a, b, c)时,编译器则使用有3个参数的版本。通过上面的两个例子,你还可以使用更为方便的模板函数重载:template <typename T>T max(const T& lsh, const T& rhs) {       return (lsh > rhs) ? lsh : rhs;}template <typename T>T max(const T& a, const T& b, const T& c){      return max(max(a, b), c);}使用float a = 3.6, b = 1.2, c = 7.8;cout << max(a, b, c) << endl;输出:       7.8通过参数个数和类型,编译器自动生成和调用对应得函数版本!动多态则是通过继承、虚函数(virtual)、指针来实现。class A {public:    virtual void func() const {         coust << “A::func()” << endl;    }}class B : public A {public:     virtual void func() const {         coust << “B::func()” << endl;    }}使用:A a* = B();a->func();输出:     B::func()编译期是不调用任何函数的,编译器编译到a->func()时只是检查有没有语法问题,经过检查没有。编译器并不知道调用的是A版本的func()还是B版本的func(),由于a是一个指向B对象的指针,所以a只知道它指向的是一个A类型(或者能转换成A类型)的对象。通常集成体系就说明了(由于是公有继承)B是一种A。在运行期,a要调用a所指向对象的func()函数,就对它指向的对象下达调用func()的命令,结果a所指向的是一个B对象,这个对象就调用了自己版本(B版)的func()函数,所以输出时B::func()总结:在编译期决定你应该调用哪个函数的行为是静态绑定(static-binding),这种现象就是静多态。在运行期决定应该调用哪中类型对象的函数的行为是动态绑定(dynamic-binding),这种现象就是动多态!

2、类型转换有哪些?

3、操作符重载(+操作符),具体如何去定义?

4、内存对齐的原则?(原则叙述了一下并举例说明)

5、模版怎么实现?

6、指针和const的用法?(就是四种情况说了一下)

7、虚函数、纯虚函数、虚函数与析构函数?(纯虚函数如何定义,为什么析构函数要定义成虚函数)

8、 内联函数(讲了一下内联函数的优点以及和宏定义的区别)

用内联取代宏:

.内联函数在运行时可调试,而宏定义不可以;

.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;

.内联函数可以访问类的成员变量,宏定义则不能;

.在类中声明同时定义的成员函数,自动转化为内联函数。

9、 const和typedef(主要讲了const的用处,有那些优点)

10、链接指示:extern “C”(作用)

11、c语言和c++有什么区别?(大体讲了一下,继承、多态、封装、异常处理等

12、new与malloc的区别,delet和free的区别?

13、异常机制是怎么回事?

14、strcpy返回类型是干嘛用的?

15、explicit是干什么用的

16、auto_ptr类

17、迭代器删除元素会发生什么?

18、模版特化的概念,为什么特化?

19、stl有哪些容器,对比vector和set?

20、虚函数,虚函数表里面内存如何分配?

21、继承机制中引用和指针之间如何转换?

22、类的封装:private,protected,public

**QT****

1、qt类中的一些继承关系?

2、qt的信号与槽机制?

3、qt有那些类,控件?

*数据结构与算法*

1、数据结构中二叉树的非递归遍历?

2、红黑树的定义和解释?

3、排序算法有哪些?快速排序怎么实现的?最好时间复杂度,平均时间复杂度

**HR面****

1、你在学校或者实习做过什么项目

2、讲一下你最有意义的一次项目经历

3、以后的职业规划

4、还有投过其他公司的简历吗?

原文链接: https://www.cnblogs.com/carsonzhu/p/5250867.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/229837

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午2:27
下一篇 2023年2月13日 下午2:27

相关推荐