以前有一篇关于interview的文章,《关于interview的一些感想(C++方向)》,今天翻博客查中断的一些资料的时候无意间又看到这篇文章。文章里面提出了一些问题现在看看又有些生疏了。特别提出来再来复习下。
基础题:
1. 请介绍下拷贝构造函数。
解答:
参考文档:http://zhidao.baidu.com/question/7513262.html
解答关键点:
在C++中,下面三种对象需要拷贝的情况。因此,拷贝构造函数将会被调用。
1). 一个对象以值传递的方式传入函数体
2). 一个对象以值传递的方式从函数返回
3). 一个对象需要通过另外一个对象进行初始化
表现形态为X(X&),英文名称:copy constructor
它的唯一的一个参数(对象的引用)是不可变的(因为是const型的)。
如果在类中没有显式的声明一个拷贝构造函数,那么,编译器会私下里为你制定一个函数来进行对象之间的位拷贝(bitwise copy)。使用拷贝构造函数是防止以上三种情况出现时,前两种是为了防止一个指针指向已经被删除的内存空间。最后一个是防止初始化和赋值有差异时避免出错。
2. 请介绍下C++的oo特性。解答:参考文档:http://zhidao.baidu.com/question/46169795.html?si=2解答关键:C++的面向对象3个特性: 1.封装。 2.继承。 3.多态。
3. 请介绍下C++的异常处理机制(_try _except机制)解答:参考文档:http://blog.csdn.net/broadview2006/archive/2009/01/14/3772488.aspx解答关键:C++中的异常处理机制是一种把控制权从异常发生的地点转移到一个匹配的处理函数或功能块的机制。一般来说,异常处理机制包括4个部分。
try语句块:即一个定义异常的语句块。
catch语句块:即一个或多个和try语句块相关的处理,它们放在catch语句块中。
throw表达式:即抛出异常语句。
异常本身。举个例子说明异常处理的使用方法:
1 #include <iostream> 2 #include <math.h> //包含头文件 3 using namespace std; //使用命名空间 4 double sqrt_delta(double d) //定义函数 5 { 6 if(d < 0) 7 throw 1; //抛出异常 8 return sqrt(d); //返回平方根值 9 } 10 double delta(double a, double b, double c) //定义函数 11 { 12 double d = b * b - 4 * a * c; 13 return sqrt_delta(d); //调用sqrt_delta()函数 14 } 15 void main() 16 { 17 double a, b, c; 18 cout << "please input a, b, c" << endl; 19 cin >> a >> b >> c; //接收输入 20 while(true) //循环 21 { 22 try //定义异常 23 { 24 double d = delta(a, b, c); //调用函数 25 cout << "x1: " << (d - b) / (2 * a); 26 cout << endl; 27 cout << "x2: " << -(b + d) / (2 * a); 28 cout << endl; 29 break; //跳出循环 30 } 31 catch(int) //定义异常处理 32 { 33 cout << "delta < 0, please reenter a, b, c.";//重新输入系数 34 cin >> a >> b >> c; 35 } 36 } 37 }
4. 请介绍下C的异常处理机制解答:参考文档:http://blog.csdn.net/hello_wyq/archive/2006/06/23/826312.aspxhttp://cpp-circle.group.javaeye.com/group/blog/94540解答关键:c语言中强大的setjmp和longjmp函数实现类似于c++的异常处理机制。基本原理:
结合setjmp,将当前的环境变量打包为frame(定义的一个结构名)压到一个异常堆栈(自定义的结构体)中,如果程序段正常运行,将此frame弹出,而如果程序出错,将异常栈的顶部元素弹出,根据这个栈顶元素的frame中保存的环境变量,通过setjmp将环境恢复,然后执行某个错误处理函数,而如果没有相应错误处理函数,重新弹出新的栈顶元素,以跳到更外层的setjmp块进行处理。参考代码:
1. //try的作用就是将一个包含环境变量env的except_frame压入Except_stack栈中。 2. //其中except_flag为setjmp的返回值,表示异常的状态 3. #define try do{ \ 4. volatile int except_flag; \ 5. Except_frame except_frame; \ 6. except_frame.prev = Except_stack; \ 7. Except_stack = &except_frame; \ 8. except_flag = setjmp(except_frame.env); \ 9. if (except_flag == EXCEPT_ENTERED) \ 10. }
扩展题:
1.directshow的结构请描述
解答:
参考文档:http://tech.163.com/05/0818/10/1REAKL0R00091589.html
解答关键:
Directshow是基于模块化,每个功能模块都采取COM组件方式,称为Filter。Directshow提供了一系列的标准的模块可用于应用开发,开发者也可以开发自己的功能Filter来扩展Directshow的应用。下面我们用一个例子来说明如何采取Filter来播放一个AVI的视频文件,工作基本流程如下:1) 首先从一个文件中读取AVI数据,形成字节流。(这个工作由源Filter完成)
2) 检查AVI数据流的头格式,然后通过AVI分割Filter将视频流和音频流分开。
3) 解码视频流,根据压缩格式的不同,选取不同的decoder filters 。
4) 通过Renderer Filter重画视频图像。
5) 音频流送到声卡进行播放,一般采用缺省的 DirectSound DeviceFilter。
2.请介绍下COM机制解答:
参考文档:http://www.vckbase.com/document/viewdoc/?id=212
解答关键:
COM是一种跨应用和语言共享二进制代码的方法。与C++不同,它提倡源代码重用。ATL便是一个很好的例证。源码级重用虽然好,但只能用于C++。它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。
COM通过定义二进制标准解决了这些问题,即COM明确指出二进制模块(DLLs和EXEs)必须被编译成与指定的结构匹配。这个标准也确切规定了在内存中如何组织COM对象。COM定义的二进制标准还必须独立于任何编程语言(如C++中的命名修饰)。一旦满足了这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器负责所产生的二进制代码与标准兼容。这样使后来的人就能更容易地使用这些二进制代码。
3.介绍下STL/ATL解答:这其实是两个问题,分别介绍STL和ATL
参考文档:
STL:http://www.sgi.com/tech/stl/
标准模板库 Standard Template Library
ATL:http://zh.wikipedia.org/zh-cn/Active_Template_Library
活动模板库Active Template Library
解答关键:
STL:C++的标准
标准模板库(STL,即Standard Template Library),是一个C++软件库,也是C++标准程式库的一部分。
模板是C++程序设计语言的一个比较新的重要特征,而标准模板库(STL)正是基于此特征。标准模板库(STL)使得C++编程语言在有了同Java一样强大的类库的同时,保有了更大的可扩展性。
ATL:来自微软的扩展
Active Template Library (ATL,又译作“活动模板库”) 是一个以C++模板技术的类的集合,由Microsoft为了简化Component Object Model (COM) 的程序设计所发布。 COM支持在Visual C++允许开发者创造各种各样的组件,OLE Automation服务器,与ActiveX控件。[1] [2] Patterned after the Standard Template Library (STL), ATL 包含一个对象向导(object wizard),当设置好主要的对象结构后,能够产生快速与较小的程序。