概述
面试经验
c/c++
1、malloc与new的区别
1、new是操作符,malloc是函数
2、new使用时先分配内存,再调用构造函数,释放时调用析构函数
3、new只能分配实例所占类型的整数倍,malloc可以随意分配。
4、new失败返回异常,malloc返回NULL
2、C语言内存分配的方式
1、静态区分配:编译时分配好,主要储存全局变量,static变量等。
2、栈分配:执行函数时,函数内部的局部变量,函数结束时,这些储存单元自动被释放
3、堆分配:也叫动态分配,通过malloc以及NEW来分配,程序员自己负责free或者delete自己申请的内存
3、struct 与 class的区别
1、class可以继承,类,接口,struct只能继承接口
2、class有默认的无参构造函数,struct没有,而且struct没有析构函数
3、class有继承级别,protected等等
4、class用垃圾回收机制保证内存的回收,struct使用完之后自动接触内存分配。
4、const常量和#define的区别
1、前者在编译期起作用,后者在预处理和编译期起作用
2、前者没有数据类型,只是简单的替换,后者有数据类型,可以进行判断,避免基础的错误。
3、前者只有一个备份,后者替换多少次就有多少个备份。
5、vector与list
1、vector 内存空间连续,底层是数组,list内存空间不连续,是双向链表,都是在堆中分配
2、vector随机访问效率高,在非尾部插入困难,list相反
3、迭代器支持不同,vector支持的“+”等等,list不支持
6、各个stl的底层实现
1、vector 为数组,支持快速随机访问
2、list底层为 双向链表,支持快速增删
3、deque是中央控制器和多个缓冲区
4、stack底层一般用list和deque实现
5、queue一般使用list和deque实现,封闭头部
6、priority_queue使用vector为底层容器,使用heap来管理规则
7、set底层为红黑树,有序不重复 multiset可重复
8、map底层为红黑树,有序不重复 multimap可重复
9、hash_set底层为hash表,无序不重复
10、hash_map底层为hash表 无序不重复
7、动态绑定与静态绑定
1、动态绑定就是继承虚函数
2、静态绑定就是函数重载
8、多态实现的三个条件、实现的原理
条件:有继承、有虚函数(virtual)重写、有父类指针(引用)指向子类对象。
实现原理:当类中声明虚函数时,编译器会在类中生成一个 虚函数表;虚函数表是一个储存 类成员函数指针的数据结构;virtual成员函数会被编译器放入虚函数表中。存在虚函数时,在创建的每个对象中都有一个指向虚函数表的指针(vptr指针)函数在运行的时候会重写这个虚函数。
9、析构函数一般写成虚函数的原因
由于类的多态性,基类指针可以指向派生类的对象。如果删除该基类的指针,就会调用该指针指向的派生类的析构函数,而派生类的析构函数又会自动调用基类的析构函数,这样整个派生类的对象被完全释放。
10、构造函数不能是虚函数的原因
虚函数相应一个指向vtable虚函数表的指针,但是这个指向vtable的指针事实上是存储在对象的内存空间的。假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。
11、抽象类与纯虚函数
-
纯虚函数: 一个函数只有函数名和形参列表,没有具体实现;语法:virtual double GetArea()=0;
-
抽象类: 在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。抽象类是不完整的,它只能用作基类。
12、重载、覆盖
重载是参数类型或者个数不同,覆盖是子类重写父类函数。
13、栈和队列
1、规则:栈先入后出,队列先入先出
2、插入删除定义不同:栈只能在一端插入和删除,队列只能在一端插入另一端删除
14、strcpy和memcpy的区别
(1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
(2)复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"