VC,C++ 面试题

 

<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-0384259630004389&dt=1207487456187&lmt=1160650322&format=728x90_as&output=html&correlator=1207487455765&url=http%3A%2F%2Fwww.pghome.net%2Fart%2Fart_177.html&ad_type=text_image&ref=http%3A%2F%2Fwww.google.cn%2Fsearch%3Fhl%3Dzh-CN%26q%3DCDC%25E5%25AF%25B9%25E8%25B1%25A1%25E8%2583%25BD%25E5%2590%25A6%25E5%25AE%259A%25E4%25B9%2589%25E4%25B8%25BA%25E4%25B8%2580%25E4%25B8%25AA%25E6%2588%2590%25E5%2591%2598%25E5%258F%2598%25E9%2587%258F%26meta%3D%26aq%3Df&frm=0&cc=99&ga_vid=443210069.1207487456&ga_sid=1207487456&ga_hid=1523102858&flash=9.0.115.0&u_h=600&u_w=800&u_ah=572&u_aw=800&u_cd=32&u_tz=480&u_his=2&u_java=true" frameborder="0" width="728" scrolling="no" height="90" allowtransparency="allowtransparency">

1、估计一下广州有多少理发师,如果允许,你还需要那些调研工作?并给出你的推导过程。你认为你的 估算结果可信吗?

2、看过那些软件方面的书籍

3、什么是软件,软件开发包括那些步骤,并说出你对这些步骤的理解

4、OSI网络结构的七层模型分别是什么,并说出你认为划分为7层的理由。

5、软件过程中了解、使用过版本控制或建模工具吗?对你工作有什么帮助?

6、软件过程中你都写过什么文档?分别是什么目的及其对你的帮助?

7、我们知道,C++将内存划分为三个逻辑区域:堆、栈和静态存储,请说出它们的区别及你的理解。

8、字符串A是由n个小写英文字母(a ~ z)构成的,定义为char A[n]。你能用更少的空间表示这个字符串吗?请写出从char A[n]到你的新的储存格式的转换函数。(请用C/C++编程,不允许上机操作)

12、对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。

9、C++构造函数为什么不能是虚函数?

10、C++中virtual与inline的含义分别是什么?虚函数的特点;内联函数的特点;一个函数能否即是虚函数又是内联函数?

12、请列出实现C++代码你认为需要注意的一些问题。

11、你在原来的项目中有没有遇到什么困难,又是如何解决的?


1 dll,lib处理实现 .lib文件中包含什么? dll在内存中被多个函数共享,有几个拷贝?
2 template,template等编译的时候作为几个类
3 struct ,class的区别,联系
4 MAcro,inline区别,实现.编译运行时
5 进程与线程区别
6 hdc-cdc区别联系
7 model dialog,modeless dialog,从创建到销毁全过程具体描述
8 各个线程new的内存,别的线程是否可以使用?
9 RUNTIME_CLASS, is what??


http://www.sinoprise.com/simple/index.php?t32.html

1. 堆和栈的区别?
栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
2. 虚函数的本质和实现机制?
虚函数的本质就是通过基类访问派生类定义的函数。虚函数只能借助于指针或者引用来达到多态的效果。
3. C++中传递函数参数的方式及他们的优缺点?
4. static关键字的作用?
5. 引用和指针的区别?
6. 函数重载和覆盖的区别?
7. 深拷贝和浅拷贝的区别?
8. 数组a[4][3]的内存结构?并指出a[2][3]和a[3][2]在内存中的位置?
9. 包含和私有继承的区别?
10. 实现一个操作栈的模板(empty,push,pop,),并实现错误处理(对空栈的pop)
11. ANSI和Unicode的区别?并指出C RunTime Library 和 Win32 API对他们的支持。
12. 线程同步的四种方式的机制。
13. 虚拟内存。
14. DLL的实现机制和DLL的输出方式。
15. D3D的顶点着色。
16. 几种数据结构在游戏中的支持。
17. 游戏引擎


服务器程序员笔试题
C++
1.简述堆和栈的区别。
2.简述虚函数的本质和实现机制。
3.列举C++中向函数传递参数的各种方式,并比较它们之间的区别和优缺点。
4.static关键字有几种用途?请简述每种用途。
5.简述引用和指针的异同。
6.简述函数重载(overloading)和覆盖(overriding)的区别。
7.什么是深拷贝?什么是浅拷贝?
8.请画出二维数组char a[4][3]的内存结构图,并指出a[3][2]和a[2][3]在内存中的位置。
9.简述包含和私有继承的异同。
10.用模板实现一个通用的栈,要求实现empty, size, push, pop, top五个成员函数,并用异常机制来报告错误(比如在一个大小为0的栈上执行pop操作)。
标准库
11.用string类编写一个程序,它从标准输入接收一行输入,然后统计出其中单词的个数,单词的分隔符只有逗号、点号和空格三种。
12.简述STL的容器container、迭代器iterator、算法algorithm和函数器functor的作用以及它们之间的关系,举例说明。
13.下面的代码存在什么问题,如何修正?
list list1;

for (int i = 0; i < 8; i ++) {
list1.push_back(i);
}

for (list::iterator it = list1.begin(); it != list1.end(); ++it) {
if (*it % 2 == 0) {
list1.erase(it);
}
}

Win32
14.比较ANSI和Unicode的区别,并说明C Runtime Library和Win32 API如何支持二者。
15.简述线程同步的四种机制。
16.简述虚拟内存机制,并描述在win95和winnt下内存空间的结构。
17.简述DLL的实现机制以及输出DLL中函数的两种方法。
网络
18.简述TCP和UDP之间的区别。
19.简述Winsock的六种主要IO处理模式。
20.描述一个你以前实现过的服务器的结构图,并分析其中可能存在的瓶颈。



16. 关联、聚合(Aggregation)以及组合(Composition)的区别?

涉及到UML中的一些概念:关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:



从实现的角度讲,聚合可以表示为:

class A {...} class B { A* a; .....}

而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:



实现的形式是:

class A{...} class B{ A a; ...}

参考文章:http://www.cnitblog.com/Lily/archive/2006/02/23/6860.html

http://www.vckbase.com/document/viewdoc/?id=422

17.面向对象的三个基本特征,并简单叙述之?

1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public)

2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。

3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

18. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

常考的题目。从定义上来说:

重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

重写:是指子类重新定义复类虚函数的方法。

从实现原理上来说:

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。

19. 多态的作用?

主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

20. Ado与Ado.net的相同与不同?

除了“能够让应用程序处理存储于DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。但是Ado使用OLE DB 接口并基于微软的COM 技术,而ADO.NET 拥有自己的ADO.NET 接口并且基于微软的.NET 体系架构。众所周知.NET 体系不同于COM 体系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,这也就是说ADO.NET 和ADO是两种数据访问方式。ADO.net 提供对XML 的支持。

21. New delete 与malloc free 的联系与区别?
答案:都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor.

22. #define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?
答案:i 为30。

23. 有哪几种情况只能用intialization list 而不能用assignment?

答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。

24. C++是不是类型安全的?
答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。

25. main 函数执行以前,还会执行什么代码?
答案:全局对象的构造函数会在main 函数之前执行。

26. 描述内存分配方式以及它们的区别?
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

27.struct 和 class 的区别

答案:struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。

从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该使用 struct 关键字,否则,你应该使用 class 关键字。

28.当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Autodesk)
答案:肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。

29. 在8086 汇编下,逻辑地址和物理地址是怎样转换的?(Intel)
答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。

30. 比较C++中的4种类型转换方式?

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值