c和c++笔试题基础

上传人:第*** 文档编号:33997595 上传时间:2018-02-19 格式:DOCX 页数:10 大小:26.27KB
返回 下载 相关 举报
c和c++笔试题基础_第1页
第1页 / 共10页
c和c++笔试题基础_第2页
第2页 / 共10页
c和c++笔试题基础_第3页
第3页 / 共10页
c和c++笔试题基础_第4页
第4页 / 共10页
c和c++笔试题基础_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《c和c++笔试题基础》由会员分享,可在线阅读,更多相关《c和c++笔试题基础(10页珍藏版)》请在金锄头文库上搜索。

1、16. 关联、聚合(Aggregation)以及组合(Composition)的区别?关联是表示两个类的一般性联系,比如“学生”和“ 老师”就是一种关联关系;聚合表示 has-a 的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:从实现的角度讲,聚合可以表示为:class A . class B A* a; .组合表示 contains-a 的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:实现的形式是:class A. class B A a; .17.面向对象的三个基本特征,并简单叙述之

2、?1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行 protection(private,protected,public)2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=接口继承以及纯虚函数)构成了功能复用的两种方式。3. 多态:系统能够在运行时,能够根据其类型确定调用哪个重载的成员函数的能力,称为多态性。(见: C+中类的多态与虚函数的使用)18. 重载(overload) 和重写 (overried,

3、有的书也叫做“覆盖” )的区别?重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重写:是指子类重新定义父类虚函数的方法。重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和 function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就

4、是说,它们的地址在编译期就绑定了(早绑定),重载和多态无关!重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,函数调用在编译期间是无法确定(调用的子类的虚函数的地址无法给出)。函数地址是在运行期绑定的(晚绑定)。 20. Ado 与 A 的相同与不同?除了“能够让应用程序处理存储于 DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。但是 Ado 使用 OLE DB 接口并基于微软的 COM 技术,而 ADO.NET 拥有自己的ADO.NET 接口并且基于微软的 .NET 体系架构。众所周知.NET 体系不同于 COM

5、 体系,ADO.NET 接口也就完全不同于 ADO 和 OLE DB 接口,这也就是说 ADO.NET 和 ADO 是两种数据访问方式。ADO.net 提供对 XML 的支持。21. New delete 与 malloc free 的联系与区别?答案:都是在堆(heap) 上进行动态的内存操作。用 malloc 函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的 destructor,而free 不会调用对象的 destructor.(可以看看:显式调用构造函数和析构函数)23. 有哪几种情况只能用 intializationlist

6、 而不能用 assignment?答案:当类中含有 const、reference 成员变量;基类的构造函数都需要初始化表。24. C+是不是类型安全的?答案:不是。两个不同类型的指针之间可以强制转换(用 reinterpret cast)。C# 是类型安全的。25. main 函数执行以前,还会执行什么代码?答案:全局对象的构造函数执行,为 malloc 分配资源,等等。26. 描述内存分配方式以及它们的区别?1) 从静态存储区域分配。内存在程序编译时已分配好,整个运行期间都存在。如全局变量,static 变量。2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执

7、行结 束时存储单元自动被释放。栈内存分配运算内置于处理器的指令集。3) 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用free 或 delete 释放内存。4) 代码区。28.当一个类 A 中没有生命任何成员变量与成员函数, 这时 sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Autodesk)答案:肯定不是零。举个反例,如果是零的话,声明一个 class A10对象数组,而每一个对象占用的空间是零,这时就没办法区分 A0,A1了。30. 比较 C+中的 4 种类型转换方式?重点是 sta

8、tic_cast, dynamic_cast 和 reinterpret_cast 的区别和应用。( 以后再补上吧)dynamic_cast:动态类型转换 static_cast:静态类型转换 reinterpret_cast:重新解释类型转换 const_cast:常量类型转换 理解: synamic_cast:一般用在父类和子类指针或应用的互相转化; static_cast:一般是普通数据类型( 如 int m=static_cast(3.14); reinterpret_cast:很像 c 的一般类型转换操作 const_cast 是把 cosnt 或 volatile 属性去掉 31.

9、分别写出 BOOL,int,float,指针类型的变量 a 与“ 零”的比较语句。答案:BOOL : if ( !a ) or if(a)int : if ( a=0)float: const EXPRESSIONEXP = 0.000001if ( a -EXP)pointer :if ( a != NULL) or if(a = NULL)32.请说出 const 与#define 相比,有何优点?1) const 常量有数据类型,而宏常量没有数据类型 。编译器可以对前者进行类型 安全检查。而对后者只进行字符替换,没有类型安全检查2) 有些集成化的调试工具可对 const 常量调试,但是不

10、能对宏常量调试。33.简述数组与指针的区别?数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a = “hello”;a0 = X;char *p = “world”; / 注意 p 指向常量字符串p0 = X; / 编译器不能发现该错误,运行时错误(2) 运算符 sizeof 可以计算数组容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是 p 所指的内存容量。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。char a=hello world;char*p = a;c

11、out1)36. 如何打印出当前源文件的文件名以及源文件的当前行号?cout next = NULL )return head;Node *p1 = head ;Node *p2 = p1-next ;Node *p3 = p2-next ;p1-next = NULL ;while ( p3 != NULL )p2-next = p1 ;p1 = p2 ;p2 = p3 ;p3 = p3-next ;p2-next = p1 ;head = p2 ;return head ;(2) 已知两个链表 head1 和 head2 各自有序,请把它们合并成一个链表依然有序。Node * Merge(

12、Node *head1 , Node *head2)if ( head1 = NULL)return head2 ;if ( head2 = NULL)return head1 ;Node *head = NULL ;Node *p1 = NULL;Node *p2 = NULL;if ( head1-data data )head = head1 ;p1 = head1-next;p2 = head2 ;elsehead = head2 ;p2 = head2-next ;p1 = head1 ;Node *pcurrent = head ;while ( p1 != NULL & p2 !

13、= NULL)if ( p1-data data )pcurrent-next = p1 ;pcurrent = p1 ;p1 = p1-next ;elsepcurrent-next = p2 ;pcurrent = p2 ;p2 = p2-next ;if ( p1 != NULL )pcurrent-next = p1 ;if ( p2 != NULL )pcurrent-next = p2 ;return head ;(3)已知两个链表 head1 和 head2 各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。(Autodesk)答案:Node * MergeRec

14、ursive(Node *head1 , Node *head2)if ( head1 = NULL )return head2 ;if ( head2 = NULL)return head1 ;Node *head = NULL ;if ( head1-data data )head = head1 ;head-next = MergeRecursive(head1-next,head2);elsehead = head2 ;head-next = MergeRecursive(head1,head2-next);return head ;43. 写一个在一个字符串(n)中寻找一个子串(m)

15、第一个位置的函数。KMP 算法效率最好,时间复杂度是(n+m)。Void get_next(char T, int next)int len = strlen(T);int j = 0;next0 = next1 = 0;for(int i = 1; i 0 & Ti != Tj) j = nextj;if(Ti = Tj)j+;nextj+1 = j;int KMP(char S,char T, int lenT)int * next = new intlenT;get_next(T, next);int j = 0;int lenS = strlen(S);for(int i = 0; i 0 & Ti != Sj)j = nextj;if(Si = Tj)j+;if(j = lenT)retrun i-j+1;44. 多重继承的内存分配问题:比如有 class A : public class B, public classC 那么 A 的内存结构大致是怎么样的?这个是 compiler-dependent 的, 不同的实现其细节可能不同。如果不考虑有虚函数、虚继承的话就相当简单;否则的话,相当复杂。可以参考深入探索 C+对象模型45. 如何判断一个单链表是有环的? struct node

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号