最近在C++软件开发的面试中经常被问到一些问题,今天简单的整理一下,希望对大家有帮助,能在面试中遇到自己会熟悉的题目。
1.指针和引用的区别: (1)引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 (2)引用初始化后不能被改变,指针可以改变所指的对象。 (3)不存在指向空值的引用,但是存在指向空值的指针。 (4)可以有多级指针,但没有多级引用。
2.虚函数和纯虚函数的区别: 1、类如果声明了虚函数,这个函数是实现了的,即使是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样编译器就可以使用动态绑定来达到多态的目的(即父类指针指向子类对象,调用子类方法)。而纯虚函数只是在基类中的一个函数定义,即是一个函数声明而已,具体的实现需要留到子类当中。 2、虚函数在子类里面也可以不进行重写(只有虚方法和抽象方法才能够被重写);但纯虚函数必须在子类去实现。 3、虚函数的类用于“实作继承”,也就是说继承接口的同时也继承了父类的实现。当然,子类也可以进行覆写,从而完成自己关于此函数的实现。纯虚函数的类用于“介面继承”,即纯虚函数关注的是接口的统一性,实现由子类去完成。 4、带纯虚函数的类叫做抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。
3.析构函数是虚函数的作用: 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的。如果析构函数不是虚函数时,delete父类指针,这时只会调用父类的析构函数。
4.vector和list的区别: vector支持随机访问,访问某个元素的时间复杂度是O(1)。list不支持随机访问,要想访问list中的某个元素只能是从前向后或从后向前依次遍历,时间复杂度是O(N)。
vector任意位置插入和删除的效率低,因为它每插入一个元素(尾插除外),都需要搬移数据,时间复杂度是O(N),而且插入还有可能要增容,这样一来还要开辟新空间,拷贝元素,是旧空间,效率会更低。list任意位置插入和删除的效率高,他不需要搬移元素,只需要改变插入或删除位置的前后两个节点的指向即可,时间复杂度为O(1)。
vector在插入元素时的时候,要重新给所有的迭代器赋值,因为插入元素有可能导致扩容,只是原来的迭代器失效,删除元素时当前迭代器同样需要重新赋值,否则会失效。list在插入元素的时候不会导致迭代器实现,删除元素的时候指挥导致当前迭代器失效,其他的迭代器不会受到影响。
vector适合需要高效率存储,需要随机访问,并且不管行插入和删除效率的场景。list适合有大量的插入和删除操作,并且不关心随机访问的场景。
5.介绍进程、线程和管程: 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。 信号量机制虽然是一种既方便又有效的进程同步机制,但是每个访问临界资源的进程都必须自备同步操作,不仅给系统管理带来麻烦,还很容易因同步操作不当造成系统死锁。这样一个新的进程同步工具就出现了——管程。管程也相当于一个进程,管程相当于围墙,将共享数据结构全部圈了起来,只留下入口和出口,并且拥有自己的消息队列,每当进程要访问共享资源的时候,必须经过管程才能进入,而管程每次只准许一个进程进入管程,从而实现互斥。 线程是轻量级的进程,在一个进程内部可以存在一个或多个线程,进程与进程之间是不能共享内存的,进程之间的消息通信不方便,但是一个进程内部的线程之间是共享这个进程的内存空间的,线程之间通信很方便。
6.TCP和UDP的区别: (1)TCP是面向连接的,UDP是无连接的。即TCP在发送数据之前需要进行三次握手建立连接,在结束通信时需要四次挥手断开连接,而UDP不需要。 (2)TCP提供可靠传输服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。TCP通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。 (3)UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。 (4)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。 比如文件传输可以使用TCP协议,而视频通话对丢包的要求没有文件传输高,可以使用UDP,一些实时的游戏也使用UDP。
以上是简单的整理,有机会再更新。
|