- this只能在成员函数中使用,全局函数,静态函数都不能使用this。
(类中的非静态函数默认是有this指针的,表明为该类的对象所有,静态函数不属于任何类的对象,没有this指针,由类直接调用)
- 空指针和悬垂指针的区别?
答:空指针是指被赋值为 NULL 的指针;delete 指向动态分配对象的指针将会产生悬垂指针。
(1) 空指针可以被多次delete,而悬垂指针再次删除时程序会变得非常不稳定;
(2) 使用空指针和悬垂指针都是非法的,而且有可能造成程序崩溃,如果指针是空指针,尽管同样是崩溃,但和悬垂指针相比是一种可预料的崩溃。
- C++中有 malloc/free,为什么还有 new/delete?
答:malloc/free 是 C/C++标准库函数, new/delete 是 C++运算符。他们都可以用于动态申请和释放 内存。
对于内置类型数据而言,二者没有多大区别。 malloc 申请内存的时候要制定分配内存的字节 数,而且不会做初始化;new 申请的时候有默认的初始化,同时可以指定初始化; 对于类类型的对象而言,用 malloc/free 无法满足 要求的。对象在创建的时候要自动执行构造函数,消亡之前要调用析构函数。由于 malloc/free 是库函数而不是运算符,不在编译器控制之内,不能把执行构造函数和析构函数的任务强加给它,因此,C++还需要 new/delete。
- 为什么构造函数不能为虚函数?
答:虚函数采用一种虚调用的方法。需调用是一种可以在只有部分信息的情况下工作的机制。如果创建一个对象,则需要知道对象的准确类型, 因此构造函数不能为虚函数。
- 如果虚函数是有效的,那为什么不把 所有函数设为虚函数?
答:不行。首先,虚函数是有代价的,由于每个虚函数的对象都要维护一个虚函数表,因此在使用虚函数的时候都会产生一定的系统开销,这是没有必要的。
- 什么是虚函数表?
虚函数是通过一张虚函数表来实现的,简称为V-Table。在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其能真实的反应实际的函数。这样,在有虚函数的类的实例中这张表被分配在了这个实例的内存中,所以当我们用父类的指针操作一个子类的时候,这张虚函数表就显得尤为重要了,他就像一个地图一样,指明了实际所应该调用的函数。
说明:虚函数表中只存有一个虚函数的指针地址,不存放普通函数或是构造函数的指针地址。只要有虚函数,C++类都会存在这样的一张虚函数表,不管是普通虚函数 亦或 是纯虚函数,亦或是派生类中隐式声明的这些虚函数都会生成这张虚函数表。
- 什么是虚函数?
答:虚函数是被virturl修饰,并在子类被重新定义的成员函数。虚函数的作用主要是实现了多态的机制,通过指向子类的父类指针或引用,访问子类中同名覆盖成员函数。
- 什么是多态?
顾名思义,也就是多种状态,多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。
- 什么是友元函数?
顾名思义,friend,也就是朋友级别的函数,不是成员函数。虽然不是成员函数,但是可以访问类中的所有成员的函数。
- stl常见的容器?
vetor | Deque | List | set | map |
---|---|---|---|---|
底层结构是数组 | 底层结构是数组 | 底层结构是双向环状链表 | 键和值相等且唯一 | 键唯一,值对应键 |
在末尾增加或者删除元素所需时间与元素数目无关,在中间或者开头增加或者删除元素所需时间是随元素数目呈线性变化。 | 随机访问每个元素,所需要的时间为常量。在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除所需时间随元素数目呈线性变化。 | 不能随机访问一个元素,可双向遍历,在开头,末尾和中间的任何地方增加或者删除元素所需时间都是常量。 | 元素默认按升序排列 | 元素默认按键的升序排列 |
- map和set的区别?
set是一种关联式容器,其特性如下:
- set以RBTree作为底层容器
- 所得元素的只有key没有value,value就是key
- 不允许出现键值重复
- 所有的元素都会被自动排序
- 不能通过迭代器来改变set的值,因为set的值就是键
map和set一样是关联式容器,它们的底层容器都是红黑树,区别就在于map的值不作为键,键和值是分开的。它的特性如下:
- map以RBTree作为底层容器
- 所有元素都是键+值存在
- 不允许键重复
- 所有元素是通过键进行自动排序的
- map的键是不能修改的,但是其键对应的值是可以修改的
- TCP和UDP的区别?
1.TCP 协议在传送数据段的时候要给段标号; UDP 协议不需要。
2.TCP 协议可靠;UDP 协议不可靠。
3.TCP 协议是面向连接;UDP 协议采用无连接。
4.TCP 协议负载较高,采用虚电路;UDP 协议低负载。
5.TCP协议的发送方要确认接受方是否收到数据段(3 次握手协议)。
6.TCP 协议采用窗口技术和流控制。
7.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
- tcp的可靠性表现在哪里?
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输
- 常见的排序算法?
算法 | 冒泡排序 | 选择排序 | 插入排序 | 希尔排序 | 归并排序 | 快速排序 |
---|---|---|---|---|---|---|
时间复杂度 (最好) | O(n) | O(n2) | O(n) | O(n) | O(nlogn) | O(nlogn) |
空间复杂度 | O(1) | O(1) | O(1) | O(1) | O(n) | O(log2n) |
稳定性 | 稳定 | 不稳定 | 稳定 | 不稳定 | 稳定 | 不稳定 |
- 简述快速排序。