c笔试题汇总(编辑修改稿)内容摘要:

同名函数: function func(p:integer):integer。 和 function func(p:string):integer。 那么编译器做过修饰后的函数名称可能是这样的: int_func、 str_func。 对于这两个函数的调用,在编译器间就已经确定了,是静态的。 也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关。 重写:和多态真正相关。 当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。 因此,这样的 函数地址是在运行期绑定的(晚绑定)。 19. 多态的作用。 主要是两个: 1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用; 2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。 20. Ado 与。 除了 “能够让应用程序处理存储于 DBMS 中的数据 “这一基本相似点外,两者没有太多共同之处。 但是 Ado使用 OLE DB 接口并基于微软的 COM 技术,而 拥有自己的 接口并且基于微软的 .NET 体系 架构。 众所周知 .NET 体系不同于 COM 体系, 接口也就完全不同于 ADO 和 OLE DB 接口,这也就是说 和 ADO 是两种数据访问方式。 提供对 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。 16 23. 有哪几种情况只能用 intialization list 而不能用assignment? 答案:当类中含有 const、 reference 成员变量;基类的构造函数都需要初始化表。 24. C++是不是类型安全的。 答案:不是。 两个不同类型的指针之间可以强制转换(用 reinterpret cast)。 C是类型安全的。 25. main 函数执行以前,还会执行什么代 码。 答案:全局对象的构造函数会在 main 函数之前执行。 26. 描述内存分配方式以及它们的区别 ? 1) 从静态存储区域分配。 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。 例如全局变量, static 变量。 2) 在栈上创建。 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。 栈内存分配运算内置于处理器的指令集。 3) 从堆上分配,亦称动态内存分配。 程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。 动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。 和 class 的区别 答案: struct 的成员默认是公有的,而类的成员默认是私有的。 struct 和 class 在其他方面是功能相当的。 从感情上讲,大多数的开发者感到类和结构有很大的差别。 感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。 既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的 !)时,你也许应该使用 struct 关键字,否则,你应该使用 class 关键字。 A 中没有生命任何成员变量与成员函数 ,这时 sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。 ( Autodesk) 答案:肯定不是零。 举个反例,如果是零的话,声明一个 class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分 A[0],A[1]…了。 29. 在 8086 汇编下,逻辑地址和物理地址是怎样转换的。 ( Intel) 答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址 *10H+通用寄存器内地址, 17 就得到了真正要访问的地址。 30. 比较 C++中的 4 种类型转换方式。 请参考: static_cast, dynamic_cast 和 reinterpret_cast 的区别和应用。 BOOL,int,float,指针类型的变量 a 与 “零 ”的比较语句。 答案: BOOL : if ( !a ) or if(a) int : if ( a == 0) float : const EXPRESSION EXP = if ( a EXP amp。 amp。 a EXP) pointer : if ( a != NULL) or if(a == NULL) const 与 define 相比,有何优点。 答案: 1) const 常量有数据类型,而宏常量没有数据类型。 编译器可以对前者进行类型安全检查。 而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到 的错误。 2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。 指针可以随时指向任意类型的内存块。 (1)修改内容上的差别 char a[] = “hello”。 a[0] = „X‟。 char *p = “world”。 // 注意 p 指向常量字符串 p[0] = „X‟。 // 编译器不能发现该错误,运行时错误 (2) 用运算符 sizeof 可以计算出数组的容量(字节数)。 sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是 p 所指的内存容量。 C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。 注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 char a[] = hello world。 char *p = a。 cout sizeof(a) endl。 // 12 字节 cout sizeof(p) endl。 // 4 字节 计算数组和指针的内存容量 void Func(char a[100]) { cout sizeof(a) endl。 // 4 字节而不是 100 字节 } 18 、覆盖和隐藏区别。 答案: : ( 1)相同的范围(在同一个类中); ( 2)函数名字相同; ( 3)参数不同; ( 4) virtual 关键字可有可无。 ,特征是: ( 1)不同的范围(分别位于派生类与基类); ( 2)函数名字相同; ( 3)参数相同; ( 4)基类函数必须有 virtual 关键字。 c.“隐藏 ”是指派生类的函数屏蔽了与其同名的基类函 数,规则如下: ( 1)如果派生类的函数与基类的函数同名,但是参数不同。 此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。 ( 2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字。 此时,基类的函数被隐藏(注意别与覆盖混淆) 35. There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers. 答案: ( ( a + b ) + abs( a b ) ) / 2 36. 如何打印出当前源文件的文件名以及源文件的当前行号。 答案: cout __FILE__。 cout__LINE__。 __FILE__和 __LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。 37. main 主函数执行完毕后,是否可能会再执行一段代码,给出说明。 答案:可以,可以用 _onexit 注册一个 函数,它会在 main 之后执行 int fn1(void), fn2(void), fn3(void), fn4 (void)。 void main( void ) { String str(zhanglin)。 _onexit( fn1 )。 _onexit( fn2 )。 _onexit( fn3 )。 _onexit( fn4 )。 printf( This is executed first.\n )。 } int fn1() 19 { printf( next.\n )。 return 0。 } int fn2() { printf( executed )。 return 0。 } int fn3() { printf( is )。 return 0。 } int fn4() { printf( This )。 return 0。 } The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (lastinfirstout) order. The functions passed to _onexit cannot take parameters. 38. 如何判断一段程序是由 C 编译程序还是由 C++编译程序编译的。 答案: ifdef __cplusplus coutc++。 else coutc。 endif ,要求排序后输出到另一个文件中 答案: # i ncludeiostream # i ncludefstream using namespace std。 void Order(vectorintamp。 data) //bubble sort { 20 int count = ()。 int tag = false。 // 设置是否需要继续冒泡的标志位 for ( int i = 0。 i count。 i++) { for ( int j = 0。 j count i 1。 j++) { if ( data[j] data[j+1]) { tag = true。 int temp = data[j]。 data[j] = data[j+1]。 data[j+1] = temp。 } } if ( !tag ) break。 } } void main( void ) { vectorintdata。 ifstream in(c:\\)。 if ( !in) { coutfile error!。 exit(1)。 } int temp。 while (!()) { intemp。 (temp)。 } ()。 //关闭输入文件流 Order(data)。 ofstream out(c:\\)。 if ( !out) { coutfile error!。 exit(1)。 } for ( i = 0。 i ()。 i++) 21 outdata[i]。 ()。 //关闭输出文件流 } 40. 链表题:一个链表的结点结构 struct Node { int data。 Node *next。 }。 typedef struct Node Node。 (1)已知链表的头结点 head,写一个函数把这个链表逆序 ( Intel) Node * ReverseList(Node *head) //链表逆序 { if ( head == NULL || headnext == NULL ) return head。 Node *p1 = head。 Node *p2 = p1next。 Node *p3 = p2next。 p1next = NULL。 while ( p3 != NULL ) { p2next = p1。 p1 = p2。 p2 = p3。 p3 = p3。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。