1. 在类的普通成员函数中调用虚函数,情况是怎么样的?(对象、引用、指针)
多态, 事实上,这是 Template Method模式的关键
2. 关于成员变量初始化顺序,几个有依赖关系的成员变量要初始化,让写出构造函数。
在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。
3. 写一个双链表。
Struct ListNode
{
int nData;
ListNode* pPreviousNode;
ListNode* pNextNode;
}
一般链表都会有一个表头节点与指向表头节点的头指针, 应该会提供列表接口, 按此数据结构实现即可。
4. 写个is-a和has-a。
这个比较简单
Class Pet{};
Class Dog: public Pet{};
Class Boy{Pet* m_pPet;};
5. struct vs. class.
1)默认访问属性, struct为public, class为private
2)class可以用来声明模板参数,而struct不能
6. 称8个小球的问题
没题
7. stl 里面vector的实现(内部空间的申请与分配)
Vector中文名字是动态数组, 其内部数据结构就是一个数组, 但是在数组元素不够用的时候,就要动态的重新分配, 一般是现在大小的两倍, 然后把原数组的内容拷贝过去。所以, 在一般情况下, 其访问速度同一般数组, 只有在重新分配发生时, 其性能才会下降
8. struct /class的区别
重复了
9. 为什么要用struct
成员的默认属性不同,用struct的话,主要是作为数据的集合。
10. 怎样使一个class不能被实例化
1,构造函数私有化,2,抽象类
11. 私有继承和public继承的区别。
私有继承: 只继承实现,不继承实现 has-a
公有继承:继承接口与实现 is-a
12. void *p的问题
不能++
13. 引用和指针的区别与联系。引用是否可以更改
联系: 支持多态,可以用来引用同一对象
区别:指针可以为NULL, 引用不可以; 指针可以重赋值, 引用不可以;
14. windows编程基础,线程与进程的区别
程序是一系列静态的指令序列
进程是程序的一次动态执行,进程其实是一个资源的容器,包括一个私有的虚拟地址空间,一些初始的代码与数据, 一些系统资源的句柄等
线程是一个进程中的执行体, 一般包括CPU寄存器状态,两个栈(内核模式,用户模式)以及一个TLS(Thread-Local Storage)等
15. com+是否熟悉
COM+是COM技术的延伸与发展, 它包括了所有COM的基本功能(基于接口的编程模型,基本组件服务),并组合了DCOM(使组件技术延伸到了分布式领域)和MTS-Microsoft Transaction Server(提供了服务器端的组件管理与配置管理),并新增了一些服务:负载平衡,内存数据库,事件模型,队列服务等,主要用于Windows DNA(Distributed interNet Application Architecture)三层结构的中间层。
16. 简述一下hash算法
哈希表的目的是表查询插入修改能够达到O(1)的算法复杂度, 通过对key编码来确定其存储地址来实现, 当不同的key得到相同的编码时,便需要进行冲突检测与处理,一般方法有除留余数法, 线性探测法,平方探测法, 这使其无法真正达到O(1)
17. 一个32位的数据,怎样找到最左边的一个1?
如果是在最左位,这个数是负数,否则的话,左移一位,看是否变成负数,这是O(n)的算法, 也可以用一个模板去与,并不断改变这个模板
O(n/2)的算法:二分方式查找 ???
18. 一个4*4的格子,填入1~15 然后给个目标状态,怎样去搜索。
题意不懂
19. 给你100万个数据,数据的值在0~65535之间 用最快的速度排序
多关键字基数排序MSD(MOST SIGNIFICANT DIGIT FIRST)
20. 如果我们的一个软件产品,用户回复说:运行速度很慢,你怎么处理?
询问其Workflow, 用户的硬件环境
21. 八皇后问题,详述解法 (八皇后问题说的是在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突)
回溯法
22. kmp快速匹配算法 ---不算轻松的搞定
普通的模式匹配算法,一旦不匹配,模式串右移一位;但是其实根据一直条件,我们可以算出应该向右移几位以避免不必要的比较;算法实现比较曲折
23. 无向图中两点间最短路问题 ---伟大的迪杰克斯拉算法
假设一共有N个节点, 需要一个一维数组Previous[N]来记录前一个节点序号;一个一维数组TotalLength[N]来记录从原点到当前节点最短路径;一个二维数组Weights[N][N]来记录各点之间边的权重(如果存在), 然后从源点到终点进行深度搜索或广度搜索, 按以下规则:搜索到某个节点b时,假设其前一个节点为a, 把TotalLength[a] + Weights[a][b]与TotalLength[b]相比较,如果小于TotalLength[b], 则TotalLength[b] = TotalLength[a] + Weights[a][b], Previous[b] = a; 反之则不做任何操作。这样到搜索结束后, 从Previous[N]数组中就能得到整条最短路径了
24. 空间中任意给两个向量,求角平分线
先单位化, 假设单位化后结果为nv1, nv2, 则角平分线为(nv1+nv2) / 2
25. 什么是平衡树
左右子树都是平衡树,且高度相差不超过1的有序二叉树
26. 哈夫曼编码问题
理论基础:霍夫曼树是带权路径长度(WPL:Weighted Path Length)最小的二叉树,它不一定是完全二叉树,应该是权值大的外结点离根节点最近的扩充二叉树。霍夫曼编码是为了实现数据的最小冗余编码,是数据压缩学的基础。 它根据字符在电文中出现的频率为权值,构造霍夫曼树,左为0, 右为1. 其有两个效果,一是保证电文有最短的编码,二是字符间不需要分隔符,因为不同的字符必定有不同的开头(成为前缀编码)。
27. 有向图求环
以该节点为源点与终点吗进行深度优先或广度优先搜索
28. .给n个点,求凸包问题
凸包(convex hull)是指一个最小凸多边形,满足这N个点都在多边形上,或其内。算法描述:
求出最右的那个点作为凸多边形的一个顶点(P0),遍历其他所有点(Pi), 如果其他点都在向量P0Pi的同一侧,则Pi也为凸多边形的顶点。
29. 四则运算(给一个前缀表达式(波兰式)或后缀表达式(逆波兰式),然后求解;给一个中缀表达式)
+*-CDBA -/EF---------------------> A+B*(C-D)-E/F 前缀-中缀
操作符进栈,一个变量tmp放上一个中间操作数(运算结果),遇到操作数检查tmp是否为空, 空的话取两个操作数,不空的话取一个操作数,另一个就是tmp了,操作符出栈运算,结果放入tmp中,如果是操作符,tmp清空
ABCD-*+EF/- ---------------------> A+B*(C-D)-E/F 后缀-中缀
操作数进栈,遇到操作符,两个操作数出栈,计算结果入栈
30. STL中container有哪些?
序列容器: vector, list, deque, bitset
关联容器: set, multiset, map, multimap
适配容器:stack, queue, priority_queue
类容器: string, valarray, bitset
扩展容器:hash_set, hash_multiset, hash_map, hash_multimap
31. map中的数据存储方式是什么?
红黑树, 是一种平衡二叉搜索树, 具有良好的最坏情况运行时间(统计性能好与AVL树)
32. map和hashmap有什么区别?
内部数据结构不同, map是红黑树,hashmap是哈希表
33. hashmap是标准库中的吗?
不是的,但在SGI stl与vc2005中都提供了。
34. vector中的erase方法跟algorithm的remove有什么区别?
vector中erase是真正删除了元素, 迭代器访问不到了。 algorithm中的remove只是简单的把要remove的元素移到了容器最后面,迭代器还是可以访问到的。因为algorithm通过迭代器操作,不知道容器的内部结构,所以无法做到真正删除。
35. object是什么?
具有内部状态,以及操作的 软件构造,用来表示真实存在(物理上或概念上)的对象
36. C++中如何阻止一个类被实例化?
纯虚函数;构造函数私有化(友元)
37. 一般在什么时候构造函数被声明成private呢?
singleton模式; 阻止某些操作(如阻止拷贝构造)
38. 什么时候编译器会生成默认的copy constructor呢?
用户没有自定义copy constructor;在代码中使用到了copy constructor;
39. 如果你已经写了一个构造函数,编译器还会生成copy constructor吗?
如果我写的是copy constructor, 不会
如果我写的不是copy constructor, 同38
40. 为什么说如果一个类作为基类,则它的析构函数要声明成virtual的?
因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。 当然,另一种做法是将基类析构函数设为protected.
41. inline的函数和#define有什么区别?什么时候会真的被inline,什么时候不会呢?
1) 宏是在预编译阶段简单文本替代, inline在编译阶段实现展开
2)宏肯定会被替代,而复杂的inline函数不会被展开
3)宏容易出错(运算顺序),且难以被调试,inline不会
4)宏不是类型安全,而inline是类型安全的,会提供参数与返回值的类型检查
当出现以下情况时inline失败
函数size太大
inline虚函数
函数中存在循环或递归
函数调用其他inline函数
42. 如果把一个类的成员函数写在类的声明中是什么意思?
inline此函数 (inline与template类似, 必须在.h中实现)
43. public继承和private继承有什么架构上的区别?
public是is-a的关系,继承接口与实现
private是has-a的关系 ,只继承实现
44. 在多继承的时候,如果一个类继承同时继承自class A和class B,而class A和B中都有一个函数叫foo(),如何明确的在子类中指出override哪个父类的foo()?
首先,foo在A,B总应该都是虚函数,否则就直接覆盖了,就没有这个问题了;其次,这个问题从语法角度来看似乎是无法解决。因为我们不能改原有设计(不然也没这个问题了:)),所有只好从extend来考虑:
class EA: public class A
{
public:
virtual void foo(){fooA();}
private:
virtual void fooA() = 0;
}
class EB: public class B
{
public:
virtual void foo(){fooB();}
private:
virtual void fooB() = 0;
}
这样, 我就可以override不同的函数来达到这个目的了
class AB: public EA, pubic EB
{
private:
virtual void fooA(){}
virtual void fooB(){}
}