c++面试基础

C++基础

  • 头文件中的 ifndef/define/endif 干什么用?
  • 答:防止头文件被重复引用
  • #include 和 #include “filename.h” 有什么区别?
  • 答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。
  • 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
  • 答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
  • switch()中不允许的数据类型是?
  • 答:实型
  • C++中为什么用模板类。
  • 答:(1)可用来创建动态增长和减小的数据结构。(2)它是类型无关的,因此具有很高的可复用性。(3)它在编译时而不是运行时检查数据类型,保证了类型安全。(4)它是平台无关的,可移植性。(5)可用于基本数据类型。
  • 程序什么时候应该使用线程,什么时候单线程效率高
  • 答:(1)耗时的操作使用线程,提高应用程序响应。(2)并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。(3)多CPU系统中,使用线程提高CPU利用率。(4)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。(5)其他情况都使用单线程。
  • Linux有内核级线程么。
  • 答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。
  • C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?
  • 答:(1)栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理。(2)堆: 程序运行时动态申请,new 和 malloc申请的内存就在堆上。
  • 使用线程是如何防止出现大的波峰。
  • 答:方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。
  • 函数模板与类模板有什么区别?
  • 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。
  • 关于内存对齐的问题以及sizof()的输出。
  • 答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。
  • int i=10, j=10, k=3; k*=i+j; k最后的值是?
  • 答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低。
  • TCP/IP 建立连接的过程?(3-way shake)
  • 答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。(1)第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;(2)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;(3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
  • 动态连接库的两种方式?
  • 答:(1)载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。(2)运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块可以通过调用 GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。
  • IP组播有那些好处?
  • 答: Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧消耗和网络拥挤问题。组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。组播可以大大的节省网络带宽,因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播技术的核心就是针对如何节约网络资源的前提下保证服务质量。
  • static有什么用途?(请至少说明两种)
  • 答:(1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。(2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。(3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用.
  • 引用与指针有什么区别?
  • 答:(1)引用必须被初始化,指针不必。(2)引用初始化以后不能被改变,指针可以改变所指的对象。(3)不存在指向空值的引用,但是存在指向空值的指针。
  • 描述实时系统的基本特性
  • 答: 在特定时间内完成特定的任务,实时性与可靠性。
  • 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
  • 答:全局变量储存在静态数据库,局部变量在堆栈。
  • 什么是平衡二叉树?
  • 答:左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
  • 堆栈溢出一般是由什么原因导致的?
  • 答:没有回收垃圾资源。
  • 什么函数不能声明为虚函数?
  • 答:constructor函数不能声明为虚函数。
  • 冒泡排序算法的时间复杂度是什么? 
  • 答:时间复杂度是O(n^2)。
  • 写出float x 与“零值”比较的if语句。 
  • 答:if(x>0.000001&&x<-0.000001)
  • Internet物理地址和IP地址转换采用什么协议?
  • 答:ARP (Address Resolution Protocol)(地址解析协议)。
  • IP地址的编码分为哪俩部分?
  • 答:IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
  • new/delete和malloc/free
  • 答:(1)delete会调用对象的析构函数,和new对应free只会释放内存。(2)new调用构造函数。(3)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 (4)对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
  • delete与 delete []区别:
  • 答:delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。
  • 结构与联合有和区别?
  • 答:(1)结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 (2)对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

数据库基础

  • 触发器怎么工作的?
  • 答:触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
  • 对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?
  • 答:将操作多个表的操作放入到事务中进行处理
  • 一般数据库若出现日志满了,会出现什么情况,是否还能使用?
  • 答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志。也就是说基本上处于不能使用的状态。
  • SQL Server是否支持行级锁,有什么好处?
  • 答:支持,设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性,行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。

 网络基础

  • OSI七层网络结构图
  1. 物理层:为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特。此外,该层中还具有确定连接设备的电气特性和物理特性等功能。
  2. 数据链路层:负责在网络节点间的线路上通过检测、流量控制和重发等手段,无差错地传送以帧为单位的数据。为做到这一点,在每一帧中必须同时带有同步、地址、差错控制及流量控制等控制信息。
  3. 网络层:为了将数据分组从源(源端系统)送到目的地(目标端系统),网络层的任务就是选择合适的路由和交换节点,使源的传输层传下来的分组信息能够正确无误地按照地址找到目的地,并交付给相应的传输层,即完成网络的寻址功能。
  4. 传输层:传输层是高低层之间衔接的接口层。数据传输的单位是报文,当报文较长时将它分割成若干分组,然后交给网络层进行传输。传输层是计算机网络协议分层中的最关键一层,该层以上各层将不再管理信息传输问题。
  5. 会话层:该层对传输的报文提供同步管理服务。在两个不同系统的互相通信的应用进程之间建立、组织和协调交互。例如,确定是双工还是半双工工作。
  6. 表示层:该层的主要任务是把所传送的数据的抽象语法变换为传送语法,即把不同计算机内部的不同表示形式转换成网络通信中的标准表示形式。此外,对传送的数据加密(或解密)、正文压缩(或还原)也是表示层的任务。
  7. 应用层:该层直接面向用户,是OSI中的最高层。它的主要任务是为用户提供应用的接口,即提供不同计算机间的文件传送、访问与管理,电子邮件的内容处理,不同计算机通过网络交互访问的虚拟终端功能等。
  • TCP/IP
  1. 网络接口层:这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协议。网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收物理帧,抽取出IP数据报并转交给网际层。
  2. 网际网层(IP层):该层包括以下协议:IP(网际协议)、ICMP(Internet Control Message Protocol,因特网控制报文协议)、ARP(Address Resolution Protocol,地址解析协议)、RARP(Reverse Address Resolution Protocol,反向地址解析协议)。该层负责相同或不同网络中计算机之间的通信,主要处理数据报和路由。在IP层中,ARP协议用于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICMP协议用于报告差错和传送控制信息。IP协议在TCP/IP协议组中处于核心地位。
  3. 传输层:该层提供TCP(传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)两个协议,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。
  4. 应用层:TCP/IP协议的应用层相当于OSI模型的会话层、表示层和应用层,它向用户提供一组常用的应用层协议,其中包括:Telnet、SMTP、DNS等。此外,在应用层中还包含有用户应用程序,它们均是建立在TCP/IP协议组之上的专用程序。
3. 参考模型和TCP/IP参考模型的区别:
1) OSI模型有7层,TCP/IP只有4层;
2) OSI先于协议出现,因此不会偏向于任何一组特定的协议,通用性更强,但有些功能不知该放哪一层上,因此不得不加入一些子层;TCP/IP后于协议出现,仅是将已有协议的一个描述,因此两者配合的非常好;但他不适合其他的协议栈,不容易描述其他非TCP/IP的网络;
3) OSI中网络层同时支持无连接和面向连接的通信,但在传输层上只支持面向连接的通信;TCP/IP中网络层只支持无连接通信,传输层同时支持两种通信;
4) 在技术发生变化时,OSI模型比TCP/IP模型中的协议更容易被替换。
4. 请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢? 
解:与IP协议配套使用的还有三个协议:
ARP-地址解析协议
RARP-逆地址解析协议
ICMP-因特网控制报文协议ICMP
IP协议-网际协议
IP地址、IP包头
5. 交换机和路由器
1. 请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?
将网络互相连接起来要使用一些中间设备(或中间系统),ISO的术语称之为中继(relay)系统。根据中继系统所在的层次,可以有以下五种中继系统:
1) 物理层(即常说的第一层、层L1)中继系统,即转发器(repeater)。
2) 数据链路层(即第二层,层L2),即网桥或桥接器(bridge)。
3) 网络层(第三层,层L3)中继系统,即路由器(router)。
4) 网桥和路由器的混合物桥路器(brouter)兼有网桥和路由器的功能。
5) 在网络层以上的中继系统,即网关(gateway).
当中继系统是转发器时,一般不称之为网络互联,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。高层网关由于比较复杂,目前使用得较少。因此一般讨论网络互连时都是指用交换机和路由器进行互联的网络。本文主要阐述交换机和路由器及其区别。
6. 第二层交换机和路由器的区别:
传统交换机从网桥发展而来,属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。因特网的路由选择协议:内部网关协议IGP和外部网关协议EGP
7. 第三层交换机和路由器的区别:
在第三层交换技术出现之前,几乎没有必要将路由功能器件和路由器区别开来,他们完全是相同的:提供路由功能正在路由器的工作,然而,现在第三层交换机完全能够执行传统路由器的大多数功能。

综上所述,交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层的设备,有些交换机也可实现第三层的交换。路由器用于WAN-WAN之间的连接,可以解决异性网络之间转发分组,作用于网络层。他们只是从一条线路上接受输入分组,然后向另一条线路转发。这两条线路可能分属于不同的网络,并采用不同协议。相比较而言,路由器的功能较交换机要强大,但速度相对也慢,价格昂贵,第三层交换机既有交换机线速转发报文能力,又有路由器良好的控制功能,因此得以广播应用。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值