您的位置:首页 > 编程语言 > C语言/C++

c++开发工程师面试总结

2017-09-24 22:50 288 查看
“ 等风吹干流过的泪和汗,总有一天,我有属于我的天”

“如果自己不相信自己,那谁来相信自己呢”

1. 预编译的作用

预处理功能主要有以下三种:宏定义、文件包含、条件编译

a. #define用来定义宏,习惯全部用大写字母来定义宏,即声明一个标识符,后面给出标识符代表的代码,后面就用代码替换标识符

b. #include预处理指令处展开被包含的文件,为了避免哪些只能包含一次的头文件被多次包含,可在头文件中用编译时条件来进行控制。

c.条件编译指令, #if指令,如果表达式为真,则编译后面的代码;#endif用于终止#if; #ifdef 等于#if defined #ifndef; #else #elif

2.面向对象的设计原则

单一职责原则:类被修改的几率很大,应该专注于单一的功能

开闭原则:对扩展开放,对修改关闭。(设计一个软件系统模块时,应该可以在不修改原有模块的基础上,扩展其功能)

里氏替换原则:任何父类出现的地方都可以用他的子类替代

接口分离原则:一个接口应该只提供一种对外的功能,不应该把所有的操作封装到一个接口当中

3. 面向对象和面向过程的区别

面向过程是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用;面向对象是把构成问题分解成各个对象,建立对象的目的不是为了完成一个步骤,是为了描述某个事物在整个解决问题的步骤中的行为。例如下五子棋,面向过程:1开始游戏,黑子先下,绘制画面,白字走,判断输赢,循环;面向对象:五子棋可分为:黑白双方,棋盘系统,规则系统。第一类对象(玩家对象)负责接收用户输入告知第二类对象(棋盘系统)绘图,同时规则系统判定。面向对象是以功能来区分的。

4 线程通信与进程通信

进程间的通信方式:

管道:(半双工的通信方式,数据只能单向流动;只能在父子进程间使用)

有名管道:(半双工,允许无亲缘关系进程间的通信)

信号量:控制多个进程对共享资源的访问,防止某进程在访问共享资源时,其它进程也访问该资源。

消息队列:共享内存:套接字

线程间的通信方式:

全局变量:最好声明为violate (使用全局变量的注意事项:加锁)

使用事件类:

线程间同步方式:

临界区:线程需要访问保护数据时,调用entercriticalSECTION函数

互斥量:

信号量:同一时刻允许多个线程访问同一个资源

事件:setevent触发,resetevent未触发

5 深度优先遍历和广度优先遍历的特点

二叉树深度优先遍历,对每一个可能的分支路径深入到不能再深入为止,每个结点只能访问一次,可细分为先序遍历,中序遍历,后序遍历;广度优先遍历,又叫层次遍历,从上往下对每一层依次访问,每一层中,从左往右(也可以从右往左)访问结点,直到没有结点可以访问为止。二叉树的深度优先遍历的非递归通用做法是采用栈,广度优先遍历的非递归通用做法是采用队列。

6 AVL树的特点

平衡二叉树,是二叉排序树,所有结点的左右子树深度之差的绝对值<=1;优点在于快速查找,插入查找删除的时间复杂度O(logn)。在插入和删除结点造成不平衡的时候需要对发生不平衡的节点及时调整,调整方法为旋转操作。根据造成不平衡结点的构型可分为LL,RR,LR,RL,对应的操作有单旋和双旋。

7 c++11新特性

1 nullptr ,可以被转换为任意的其它的指针类型,以前的程序用到名为NULL的预处理变量,它的值就是0;(预处理是运行于编译过程之前的一段程序)

2 auto类型说明符,编译器通过初始值来推算变量类型。for(auto i:v),有点像python中for i in [5];

3 vector 列表初始化新方法 vector v = {“li”, “song”, “yu”};

4 数字转字符串,to_string ,字符串转数字,stoi,stol(转long int);

5 override关键字;可以让编译器为我们检测一些错误。

8 产生死锁的原因

指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程将永远不能向前推进。(1)竞争系统资源(2)进程推进的顺序不当

产生死锁的必要条件:互斥(一段时间内某资源仅为一进程占用)请求保持(因请求资源而阻塞时,对已获得的资源保持不放)不剥夺(已获得的资源不能被剥夺)环路等待(存在一个进程资源的环形链)

避免死锁的算法:银行家算法

9 vector和list的区别

vector拥有连续的内存空间,支持随机存取,但同时在中间进行插入和删除会造成内存块的拷贝。所以如果需要高校的随机存取,不在乎插入删除的效率,用vector。list是由数据结构中的双向链表实现的,拥有一段不连续的内存空间,随机存取变得非常没有效率,但由于链表的特点,很好的支持在任意地方插入和删除。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: