最近看了些C/C++方面的一些面试题,对于一些容易忘记并且重要的简单做一个总结。
1、宏定义概念
宏定义是C++预处理命令之一。
2、宏定义如何展开
宏展开是将宏体去代替宏指令名。
3、包含头文件时如何查找头文件
标准头文件在系统目录下查找。自定义头文件会依次在用户目录、安装目录、系统文件下查找
4、什么是异常,如何抛出与捕获异常
a、异常就是程序运行时出现的不正常,他会导致系统无法正常运行
b、通过try块和异常处理构成异常机制,catch捕获异常并且执行异常处理,throw抛出异常
5、什么是指针
指针是存储内存地址的变量,指向单个对象的地址。
6、指针数组与数组指针区别
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]
7、如何实现多态
通过继承机制与虚函数来实现。
8、虚函数的作用
虚函数作用是实现动态联编,当程序发现虚函数前的virtual关键字后,会将其自动作为动态联编处理,即在程序运行时动态选择合适的成员函数。
9、虚函数表
虚函数是通过虚函数表来实现的。表中,主要是虚函数的地址表,解决继承、覆盖问题。
10、C++支持参数不确定的函数吗
可以通过隐藏参数机制(...)来支持参数个数不确定的函数。va_list进行管理。
11、什么是函数模板,什么是类模板
使用了模板技术定义了参数化类型的非常员函数。类模板类似。
12、容器特点总结
vecor:vector对元素访问时间比较小。多用于不需要对数据进行增删的场合。vector实际是一个动态数组。
list:list是一种链表的实现。存储元素是通过双链表实现。list对任意位置进行插入与删除时比较快
13、C++如何实现泛型编程
主要是通过模板。
14、进程与线程
资源的最小单位是进程。
线程是操作系统最小的调度单位。
区别:进程拥有多个线程,进程用于独立内存单元。
15、设计模式理念
设计模式目的为了重用与扩展。
16、C、C++定义结构的区别
C++结构可以声明函数。
17、构造函数可否为虚函数,析构函数呢。
构造函数不能为虚函数,原因1:要构造函数,需要清楚构造什么,原因2:对象还没有实例化。
析构函数可以为虚函数,也可以为纯虚函数。
18、深度拷贝、浅拷贝
深度拷贝拷贝了资源和指针。
浅拷贝只拷贝指针(PS:包含指针的话容易程序崩溃)。
19、为什么引入纯虚函数
作为一种接口。
20、什么是MVC,举例说明
观察者模式
21、列举几种进程同步机制
信号量、管程、会合、分布式系统
22、进程间通信
共享存储系统、消息传递系统、管道(PS:基于文件系统)。
23、操作系统进程调度策略
先来先服务、最短作业优先、最高响应比优先法、时间片轮转、多级反馈,是一种CPU调度处理机制算法(PS:UNIX操作系统采用改算法)
24、ISO七层模型是什么,TCP/UDP属于哪一层,
TCP/UDP优缺点
七层主要包括:应用层,表示层,会话层,运输层,网络层,物理链路层,物理层。
TCP\UDP属于运输层。
25、一个类所占内存空间可以为0吗
不能。
26、面向对象的3个基本特征
封装、继承、多态。
27、struce、class区别
28、重载、重写区别
29、new、malloc区别
30、main执行前、后会执行什么代码
全局对象的构造会在main前执行
31、什么函数不能
声明
为虚函数
构造函数。
32、internet采用什么协议
采用的是TCP\UDP,
TCP\UDP为5层协议:应用层、传输层、网络层、数据链路层、物理层。
33、什么是预编译
处理#开头的指令,比如头文件展开、#define的替代等。
34、添加Extern "C"目的
extern关键字是告诉编译器,其声明的函数和变量可以在本模块或其他模块使用。