C++面试题(一)

1. C和C++的特点和区别

C语言的特点:
 1.作为一种面向过程的结构化语言,易于调试和维护;
 2.表现能力和处理能力极强,可以直接访问内存的物理地址;
 3.C语言实现了对硬件的编程操作,也适合应用软件的开发;
 4.C语言具有高效率、可移植等特点。
C++语言的特点:
 1.在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;
 2.可以使用抽象数据类型进行基于对象的编程;
 3.可以使用多继承、多态进行面向对象的编程;
 4.可以负担起以模板为特征的泛型化编程。
C和C++语言的本质差别:C++是面向对象的,C语言是面向过程的。

2. C++多态


 C++的多态特性,它是C++继承数据抽象和继承之后的第三个特性;它是指在基类的成员函数前面加上virtual关键字,在派生类中重写该函数,运行时会根据对象的实际类型来调用对应的成员函数。如果对象类型为派生类,则调用派生类重写的成员函数;若对象类型为基类,则调用基类中的成员函数。
 纯虚函数:"virtual void fun() = 0;"即为纯虚函数,必须在子类中实现该函数,且基类是不能被实例化的。

3. 虚函数实现

 简单的说,每一个含有虚函数的类都至少有一个与之对应的虚函数表,其中存放这该类的所有虚函数书对应的函数指针。

4. C和C++内存分配问题

 C语言的内存基本构成:
  C的内存基本上分为4部分:静态存储区、堆区、栈区和常量区。1.静态区(又称全局区),即全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后释放。2.堆区,一般由程序员分配释放,若程序员不释放,程序结束时可能有OS回收。3.栈区,由编译器自动分配释放;4.常量区,一般程序结束时释放。
  a.函数体中定义的变量通常是在栈上;b.用malloc、calloc、realloc等分配内存的函数分配得到的内存就是在堆上;c.在所有函数体外定义的变量是全局变量;d.加static修饰符的变量均放在全局区(静态区);e.在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件中用;f.在函数体内定义的static变量表示只在函数体内有效;g.函数中的”adjsha“类似的字符串存放在常量区。
 C++语言的内存基本构成:
  C++的内存基本上分为5部分:堆区、栈区、全局/静态存储区、常量区和代码区。1.堆区,是那些由new分配的内存块,它们的释放编译器不做处理,有程序员自己控制,一般一个new对应一个delete;2.栈区,是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量、函数参数等;3.全局/静态存储区,全局变量和静态变量被分配到同一块内存中;4.常量区,是一块比较特殊的存储区,它们里面存放的是常量,不允许修改;5.代码区,存放代码(如函数),不允许修改,但可以执行。

5. 协程

 协程,是一种用户态的轻量级线程。
 携程拥有自己的寄存器上下文和栈。协程调度切换时,它将寄存器上下文和栈保存到其它地方,再切回来的时候,恢复先前保存的寄存器上下文和栈。因此,协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,都相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置;
 协程的优点:1.跨平台;2.跨体系结构;3.无需线程上下文切换的开销;4.无需原子操作锁定及同步的开销;5.方便切换控制流,简化编程模型。
 高并发+高扩展性+低成本:一个cpu支持上万的协程都不是问题,所以很适合用于高并发处理。
 协程的缺点:1.无法利用多核资源;协程的本质是个单线程,它不能同时将单个cpu的多核用上,协程需要和进程配合才能运行在多cpu上;2.进行阻塞操作会阻塞掉整个程序;这一点和事件驱动一样,可以使用异步IO操作来解决。

6. CGI的了解

 CGI:通用网关接口(Common Gateway Interface)是一个web服务器主机提供信息服务的标准接口。通过CGI接口,web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
 CGI通信系统的组成分为两部分:一部分是html页面,就是在用户端浏览器上显示的页面;另一部分,则是运行在服务器上的CGI程序。

7. 进程间通信方式和线程间通信方式

进程间通信方式:
 1.管道(pipe),是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
 2.有名管道(namedpipe),是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
 3.信号量(semaphore):是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不用线程之间的同步手段。
 4.共享内存(share memory),是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其它进程见通信方式运行效率低而专门设计的。它往往与其它通信机制,如:信号量配合使用,来实现进程间的同步和通信。
 5.套接字socket,是一种进程间通信机制,与其他通信机制不同的是,它可用于不用机器间的进程通信。
 6.消息队列(message queue),是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
线程间通信方式:
 1.全局变量(互斥所、条件变量、读写锁);
 2.Messages消息机制;
 3.CEvent对象(MFC中的一种线程通信对象,通过其触发状态的改变是吸纳同步与通信)。

8. TCP握手和释放

TCP握手:
 第一次握手:主机A发送握手信号syn=1和seq=x(随机产生的序列号)的数据包到服务器,主机B由syn=1知道,A要求建立连接;
 第二次握手:主机B收到请求后要确认联机信息,向A发送syn=1,ack=x(主机A的seq)+1,以及随机产生的确认段序列号seq=y的包。
 第三次握手:主机A收到后,检查ack是否正确,即第一次发送的seq+1,若正确,主机A会再发送ack=y+1,以及随机序列号seq=z,zhujiB收到后确认ack,正确则建立成功。
TCP释放:
 1.TCP客户端发送一个FIN,用来关闭客户端到服务端的数据传送(报文段4);
 2.服务器收到FIN,发送一个ack,确认序号为收到的序号+1(报文段5)。和syn一样,一个FIN将占用一个序号;
 3.服务器关闭客户端的连接后,再发送一个FIN给客户端(报文段6);
 4.客户端收到服务端的FIN后,发回ack报文确认,并将确认序号设置为收到序号+1(报文段7)。

9. http和https的区别

 https协议是由ssl和http协议构建的可进行加密传输、身份认证的网络协议,要比http安全。
 https(Secure Hyper text Transform Protocol)安全超文本传输协议,和http的主要区别有:
  1. http属于超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议;
  2.http和https使用的是完全不同的连接方式,用的端口也不一致,前者是80,后者是443;。
 http和https协议均是应用层协议。
 http协议:
  http和TCP协议之间的区别和联系:1.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而htpp是应用层协议,主要解决如何包装数据;2.http的默认端口号为80,TCP/IP协议通信编程时端口号需要自己指定(例如socket编程);3.http协议是在TCP/IP协议的基础上实现的,即http数据包是经过TCP/IP协议实现传输的;4.http是无状态的短连接协议,TCP是有状态的长连接协议。
  http协议其完整的工作过程分为四步:1.连接:首先客户机与服务器需要建立连接(由TCP/IP握手连接实现),只需要单击某个超级连接,http开始工作;2.请求:建立连接后,客户机发送一个请求给服务器,请求格式为:统一资源标识符(URL)、协议版本号、后边是MIME信息包括请求修饰符、客户机信息和可能的内容;3.应答:服务器接收到请求后,给鱼相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或者错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上;4.关闭:应答结束后,浏览器和服务器关闭连接,以保证其他浏览器可以与服务器进行连接。
 https协议的握手五步:1.浏览器请求连接;2.服务器返回证书:证书里面包含了网站地址、加密公钥、以及证书的颁发机构等信息;3.浏览器收到证书后,需要做(a.验证证书的合法性;b.生成随机密码,取出证书中提供的公钥对随机密码加密;c.将之前生成的加密随机密码等信息发送给网站)三步;4.服务器收到消息后,操作如下(a.使用自己的私钥解密浏览器用的公钥加密的消息,并验证HASH是否与浏览器发来的一致;b.使用加密的随机对称密码加密一段消息,发送给浏览器);5.浏览器解密并计算握手消息的HASH:如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由执勤啊浏览器生成的随机密码并利用对称加密算法进行加密。
  注:服务器有两个密钥,一个公钥、一个私钥,只有私钥才可以解密公钥加密的信息。
  https协议、ssl和数字证书之间的关系:对于https协议,所有的消息都是经过ssl协议加密,而支持加密的文件正式数字证书。1. ssl,常用的加密算法有对称加密算法、非对称加密算法、散列算法;SSL的加密过程:需要注意的是非对称加密算法的效率要比对称加密要低很多。所以ssl在握手过程中使用非对称加密算法来协商密钥,实际使用对称加/解密算法对http内容进行加/解密;2.数字证书,是用于INTERNET上标识个人或机构身份的一种技术手段,它通过由一些公认的权威机构所认证,从而可以保证其安全地被应用在各种场合。证书里面包含了网站地址、加密公钥、以及证书的颁发机构等信息。

10. 虚拟内存的概念与介绍

 虚拟内存中,允许将一个作业分多次调入内存,需要时就调入,不需要的就先放在外存。因此,虚拟内存是需要建立在离散分配的内存管理方式的基础上。虚拟内存的实现有一下三种:请求分页存储管理、请求分段存储管理、请求段页式存储管理。
 虚拟内存的意义:
  1.虚拟内存可以使得物理内存更加高效。虚拟内存使用置换方式,将需要的页面置换进来,不需要的页面置换出去,使得内存中只保存了需要的页,提高了利用率,也就避免了不必要的写入和擦除;
  2.使用虚拟地址可以使内存的管理更加便捷。在程序编译的时候就会生成虚拟地址,该虚拟地址并不是对应一个物理地址,因此就极大地减少了地址被占用的冲突,降低管理难度。
  3.为了安全性考虑。在使用虚拟地址的时候,暴露给程序员的永远都是虚拟地址,而具体的物理地址在哪里,这个只有系统才了解。因此就提高了系统的封装性。

11. 单链表的反转算法

 思想:创建3个指针,分别指向上一个节点、当前节点、下一个节点,遍历整个链表的同事,将正在访问的节点指向上一个节点,当遍历结束后,就同事完成了链表的反转。

ListNode* reserve_list(ListNode* head){
	ListNode *pre, *current, *next;
	if (nullptr == head || nullptr == head->next){
		return head;
	} else {
		pre = head;
		current = head->next;
		pre->next = nullptr;
		while(nullptr != current){
			next = currnet->next;
			current->next = pre;
			pre = current;
			current = next;
		}
		return pre;
	}
}

12. 红黑树以及其查找复杂度

 略(后面补上)

13. KMP字符串匹配

 参考KMP算法详解之C++

14. TCP超时等待、重传以及流量控制

 TCP超时等待时间需要设定,超过了就认为丢包,需要重传;
 为了防止拥塞情况,一般会采用流量控制,其实现手段是用滑动窗口限制客户端发送分组数量。

C++面试题(二)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值