C++经典笔试题.pdf

上传人:无*** 文档编号:90921739 上传时间:2023-05-18 格式:PDF 页数:51 大小:6MB
返回 下载 相关 举报
C++经典笔试题.pdf_第1页
第1页 / 共51页
C++经典笔试题.pdf_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《C++经典笔试题.pdf》由会员分享,可在线阅读,更多相关《C++经典笔试题.pdf(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1.是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?v i r t u al 修饰符会被隐形继承的。pr i v at e也被集成,只事派生类没有访问权限而已。v i r t u al 可加可不加。子类的空间里有父类的所有变量(s t at i c除外)同一个函数只存在一个实体(i n l i n e除外)。子类覆盖它的函数不加v i r t u al ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。2.输入一个字符串,将其逆序后输出。(使用C+,不建议用伪码)#i n cl u de u s i n g n am es

2、pace s t d;v o i d m ai n()(ch ar a50;m em s et(a,0,s i z eo f(a);i n t i=0,j;ch ar t;ci n.g et l i n e(a,50,n );f o r(i=0,j=s t r l en(a)-1;i s t r l en(a)/2;i+,j一)(t=ai;ai=aj;aj=t;)co u t a s t r;s t r.r epl ace;co u t a/=(k+m)*1*(k+m);=a=a/9;=a=1;是错的S Q R (k+m)/S Q R (k+m)=k+m*k+m/k+m*k+m 正确5 .co

3、nst符号常量;(l)const char*p(2)char const*p(3)char*const p说明上面三种描述的区别;如果const位于星号的左侧,则 const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。(1)const char*p一个指向char类型的const对象指针,p 不是常量,我们可以修改p 的值,使其指向不同的char,但是不能改变它指向非char对 象,如:const char*p;char cl=,a;char c2=,b;p=&cl;/okp=&c2;/ok*p=cl;/error

4、(3)char*const p此时*p 可以修改,而 p 不能修改。(4)const char*const p这种是地址及指向对象都不能修改。6 .下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?int n;if(n=1 0)/第一种判断方式if(1 0 =n)/第二种判断方式如果少了个二号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=7 .下面的代码有什么问题?void D oS omeT hing(.)(char*p;p=malloc(1 0 2 4);/分配 I K 的空间if(N U L L =p)return;p=realloc(p,2 0 4 8);/空间

5、不够,重新分配到2 Kif(N U L L =p)return;)A:p=malloc(1 0 2 4);应该写成:p=(char*)malloc(1 0 2 4);没有释放P的空间,造成内存泄漏。8.下面的代码有什么问题?并请给出正确的写法。v o i d Do So m e Th i n g(ch ar*p)(ch ar s t r 16;i n t n;as s e rt(NUL L !=p);s can f(p,%s%d”,s t r,n);i f (0=s t rcm p(s t r,s o m e t h i n g)A:s s can f(p,z/%s%dz,,s t r,n);

6、这句该写成:s s can f (p,s t r,&n);9.下面代码有什么错误?Vo i d t e s t l ()(ch ar s t ri n g 10;ch ar*s t rl=”0123456789”;s t rcp y(s t ri n g,s t rl);)数组越界10.下面代码有什么问题?Vo i d t e s t 2()(ch ar s t ri n g 10,s t rl 10;f o r(i=0;i 10;i+)s t rl i =a)s t rcp y(s t ri n g,s t rl);)数组越界11.下面代码有什么问题?Vo i d t e s t 3(ch

7、ar*s t rl)(ch ar s t ri n g El O;i f(s t rl e n(s t rl)=M AX_SRM)re t u rn (NUL L _SRM);e l s ere t u rn SRM _n o;系统会初始化s t at i c i n t变量为0,但该值会一直保存,所谓的不可重入.13.写出运行结果:/t e s t lch ar s t r=w o rl d;co u t s i z e o f(s t r):;ch ar*p=s t r;co u t s i z e o f(p):;ch ar i=10;co u t s i z e o f(i):;v o

8、 i d*p p=m al l o c(10);co u t s i z e o f (p)65536)(cout32 b it”endl;)else(cout*16 b itw e n d l;)16.C和 C+有什么不同?从机制上:C是面向过程的(但C也可以编写面向对象的程序);C+是面向对象的,提供了类。但是,C+编写面向对象的程序比C容易从适用的方向:C适合要求代码体积小的,效率高的场合,如嵌入式;C+适合更上层的,复杂的;llin u x 核心大部分是c 写的,因为它是系统软件,效率要求极高。从名称上也可以看出,C+比c多了+,说明C+是c的超集;那为什么不叫c+而叫C+呢,是因为C

9、+比c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了 C+C语言是结构化编程语言,C+是面向对象编程语言。C+侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。17.在不用第三方参数的情况下,交换两个参数的值include void main()int i=60;int j=50;i=i+j;j=i-j;i=i-j;printf(i=%dn”,i);printf(j=%dn”,j);)方法二:.一 .1=j;J=1;1 二J;方法三:/用加减实现,而且不会溢出a=a+b-(b=a)1 8.有关位域的面试题(为什么输出的是一个奇怪的字符)a.t =b;效果相当于 a.t=b&O

10、xf;,b,0 1 1 0 0 0 1 0 b&O xf-0 0 0 0 0 0 1 0所以输出As c i i 码为2的特殊字符c har t:4;就是4 bi t 的字符变量,同样uns i gned s hor t i :8;就是8 bi t 的无符号短整形变量1 9.i nt i=1 0,j=1 0,k=3;k*=i+j;k 最后的值是?6 02 0.进程间通信的方式有?进程间通信的方式有共享内存,管 道,S oc k et ,消息队列,DDE等2 1.s t r uc t A(c har t:4;c har k:4;uns i gned s hor t i:8;uns i gned

11、l ong m;s i zeof(A)=?(不考虑边界对齐)8s t r uc t CEL L/Dec l ar e CEL L bi t fi el duns i gned c har ac t er :8;/0 0 0 0 0 0 0 0?uns i gned for egr ound :3;/0 0 0 0 0?0 0 0 0 0 0 0 0uns i gned i nt ens i t y:1;/0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0uns i gned bac k gr ound :3;/0?0 0 0 0 0 0 0 0 0 0 0 0uns i gned

12、bl i nk :1;/7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s c r een 2 5 8 0;/Ar r ay of bi t fi el d s二、位结构位结构是一种特殊的结构,在需按位访问个字节或字的多个位时,位结构比按位运算符更加方便。位结构定义的一般形式为:s t r uc t 位结构名数据类型变量名:整型常数;数据类型变量名:整型常数;位结构变量;其中:数据类型必须是i nt(uns i gned 或 s i gned)。整型常数必须是非负的整数,范围是0 1 5,表示二进制位的个数,即表示有多少位。变量名是选择项,可以不命名,这样规定是为了排列需要。例

13、如:下面定义了一个位结构。s t r uc t uns i gned i nc on:8;/*i nc on 占用低字节的 0 7 共 8 位*/uns i gned t xc ol or:4;/*t xc ol or 占用高字节的 0 3 位共 4 位*/uns i gned bgc ol or:3;/*bgc ol or 占用高字节的 4 6 位共 3 位*/uns i gned bl i nk:1;/*bl i nk 占用高字节的第 7 位*/c h;位结构成员的访问与结构成员的访问相同。例如:访问上例位结构中的bgc ol or 成员可写成:c h.bgc ol or注意:1 .位结构

14、中的成员可以定义为uns i gned,也可定义为s i gned,但当成员长度为1 时,会被认为是uns i gned 类型。因为单个位不可能具有符号。2 .位结构中的成员不能使用数组和指针,但位结构变量可以是数组和指针,如果是指针,其成员访问方式同结构指针。3 .位 结构总长度(位数),是各个位成员定义的位数之和,可以超过两个字节。4 .位结构成员可以与其它结构成员一起使用。例如:s t r uc t i nfoc har name 8;i nt age;s t r uc t ad d r ad d r es s;fl oat pay;uns i gned s t at e:1;uns i

15、 gned pay:1;wor k er s;上例的结构定义了关于一个工人的信息。其中有两个位结构成员,每个位结构成员只有一位,因此只占一个字节但保存了两个信息,该字节中第一位表示工人的状态,第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。2 2.下面的函数实现在个固定的数上加上一个数,有什么错误,改正i nt a d d n(i nt n)sta ti c i nt i=1 0 0;i+=n;re turn i;)答:因为sta ti c 使 得 i 的值会保留上次的值。去掉sta ti c 就可了2 3 .下面的代码有什么问题?c la ss A(pub li c:A()p=

16、th i s;A()i f(p!=NULL)d e le te p;p=NULL;A*p;);答:会引起无限递归2 4 .uni on a i nt a _ i ntl;d oub le a d oub le;i nt a _ i nt2;);type d e f struc t(a a l;c h a r y;b;c la ss c(d oub le c _ d oub le;b b l;a a 2;);输出 c outsi ze of(c)e nd l;的结果?答:VC 6环境下得出的结果是3 2另:我(sun)在 VC 6.0+wi n2 k 下做过试验:sh ort-2,i nt-4,

17、floa t-4,d oub le-8,指针-4si ze of(uni on),以结构里面si ze 最大的为uni on的 si ze2 5.i nt i =1;i nt j =i+;i f(i j+)&(i+=j)i+=j;答:i =52 6.unsi g ne d sh ort a rra y =l,2,3,4,5,6,7);i nt i =3;*(a rra y+i)=?答:42 7.c la ss A(vi rtua l voi d fund ();voi d func 2();)C la ss B:c la ss A(voi d fund ()c out funl i n c l

18、a ss B e nd l;vi rtua l voi d func 2()c out ,zfun2 i n c la ss B e nd l;)A,A中的func l和 B中的func 2 都是虚函数.B,A中的func l和 B中的func 2 都不是虚函数.C,A中的func 2 是虚函数.,B中的func l不是虚函数.D,A中的func 2 不是虚函数,B中的func l是虚函数.答:A2 8.数据库:抽出部门,平均工资,要求按部门的字符串顺序排序,不能含有h uma n re sourc e部门,e mploye e 结构如下:e mploye e i d,e mploye e n

19、a me,d e pa rt i d,d e pa rt na me,wa g e答:se le c t d e pa rt na me,a vg (wa g e)from e mploye ewh e re d e pa rt na me h uma n re sourc e,g roup b y d e pa rt_ na meord e r b y d e pa rt na me2 9.给定如下SQL数据库:Te st(num INT(4)请用一条SQL语句返回num的最小值,但不许使用统计功能,ia MIN,MA X等答:se le c t top 1 numfrom Te stord

20、 e r b y num d e sc3 1 .试编写函数判断计算机的字节存储顺序是开序(li ttle e nd i a n)还是降序(b i g e nd i a n)答:b oo1 IsB i g e nd i a n()(unsi g ne d sh ort usD a ta =0 x1 1 2 2;unsi g ne d c h a r*puc D a ta =(unsi g ne d c h a r*)&usD a ta;re turn(*puc D a ta =0 x2 2);)3 2 .简述 C ri ti c a l Se c ti on 和 Mute x 的不同点对几种同步

21、对象的总结1 .C ri ti c a l Se c ti onA.速度快B.不能用于不同进程C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取)2 .Mute xA.速度慢B.可用于不同进程C.不能进行资源统计3 .Se ma ph oreA.速度慢B.可用于不同进程C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取)4 .E ve ntA.速度慢B.可用于不同进程C.可进行资源统计3 3.一个数据库中有两个表:一张表为C u s t o m e r,含字段I D,Na m e;一张表为 Or d e r,含字段 I D,C u s t o m e r l D(连向 C

22、 u s t o m e r 中 I D 的外键),Re v e n u e;写Hl 求每个C u s t o m e r 的 Re v e n u e 总和的SQL 语句。建表c r e a t e t a b l e c u s t o m e r(I D i n t p r i m a r y k e y,Na m e c h a r(1 0)goc r e a t e t a b l e o r d e r(I D i n t p r i m a r y k e y,C u s t o m e r l D i n t fo r e i gn k e y r e fe r e n c e

23、 s c u s t o m e r(i d),Re v e n u efl o a t)go-查询s e l e c t C u s t o m e r.I D,s u m(i s n u l 1(Or d e r .Re v e n u e,0)fr o m c u s t o m e r fu l l j o i n o r d e r o n(o r d e r ,c u s t o m e r i d=c u s t o m e r.i d )gr o u p b y c u s t o m e r,i d3 5.程序改错c l a s s m m l(p r i v a t e:s

24、 t a t i c u n s i gn e d i n t x;p u b l i c:m m l ()x+;m m l(s t a t i c u n s i gn e d i n t&)x+;x 一;)p u l i c:v i r t u a l m o n()=0;s t a t i c u n s i gn e d i n t m m c()r e t u r n x;);c l a s s n n l z p u b l i c m m l(p r i v a t e:s t a t i c u n s i gn e d i n t y;p u b l i c:n n l ()

25、x+;n n l(s t a t i c u n s i gn e d i n t&)x+;n n l x 一;p u b l i c:v i r t u a l m o n();s t a t i c u n s i gn e d i n t n n c()r e t u r n y;;代码片断:m m l*p p =n e w n n l;d e l e t e p p;A:基类的析构函数应该为虚函数v i r t u a l x ;3 6.1 0 1 个硬币1 0 0 真、1 假,真假区别在于重量。请用无祛码天平称两次给出真币重还是假币重的结论。答:1 0 1 个先取出2 堆,3 3,3

26、 3第次称,如果不相等,说明有一堆重或轻那么把重的那堆拿下来,再放另外3 5个中的3 3如果相等,说明假的重,如果不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻)第一次称,如果相等的话,这66个肯定都是真的,从这66个中取出3 5个来,与剩下的没称过的 3 5个比下面就不用说了方法二:第 3题也可以拿A(50),B(50)比一下,一样的话拿剩F 的一个和真的比一下。如果不一样,就拿其中的一堆。比如A(50)再分成两堆2 5 比一下,一样的话就在B(50)中,不 一 一 样就在A(50)中,结合第一次的结果就知道了。3 7.s t a t i c 变量和s t a t i c 函数

27、各有什么特点?答:s t a t i c 变量:在程序运行期内一直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的b l o c k 内可见;s t a t i c 函数:在编译单元内可见;3 8.用 C写一个输入的整数,倒着输出整数的函数,要求用递归方法;答:v o i d fu n(i n t a )(p r i n t f(%d”,a%1 0 );a /-1 0;i f(a =0&.n 、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。以 I:2-8 参考 h l l p:b l o g,c sd n.n e t/ysu n c

28、n/a rc h i v e/2 0 0 7/0 9/1 6/1 7 8 7 3 8 0.a sp x9.结构与联合有和区别?1 .结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。2 .对于联合的不同成员赋值,将会对其它成员市写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。1 0.下面关于“联合”的题目的输出?a)#i n c l u d e u n i o n(i n t i;c h a r x 2;a;v o i d m a i n ()a.x 0 =

29、1 0;a.x l =1;p ri n t f (%d ,a.i);)答案:2 6 6 (低位低地址,高位高地址,内存占用情况是O xO l O A)b)m a i n()(u n i o n /*定义一个联合*/i n t i;st ru c t /*在联合中定义一个结构*/c h a r f i rst;c h a r se c o n d;h a l f;n u m b e r;n u m b e r,i =0 x4 2 4 1;/*联合成员赋值*/p ri n t f (/z%c%c n,z,n u m b e r,h a l f,f i rst,m u m b e r.h a l f

30、,se c o n d);n u m b e r.h a l f,f i rst=a ;/*联合中结构成员赋值*/n u m b e r,h a l f,se c o n d=b;p ri n t f (z,%x n,z,n u m b e r,i);g e t c h O ;)答案:A B (0 x4 1 对应A,是低位;0 x4 2 对应B,是高位)6 2 6 1 (n u m b e r,i 和 n u m b e r,h a l f 共用块地址空间)1 1 .已知st rc p y的函数原型:char strcpy(char*strDest,const char*strSrc)st r

31、D e st 是目的字符串,st rS rc 是源字符串。不调用C+/C 的字符串库函数,请编写函数st rc p yo答案:c h a r*st rc p y(c h a r*st rD e st,c o n st c h a r*st rS rc)(i f (st rD e st =N UL L|st rS rc =N UL L)re t u rn N UL L ;i f (st rD e st =st rS rc)re t u rn st rD e st ;c h a r t e m p p t r=st rD e st ;w h i l e(*st rD e st+=*st rS rc

32、+)!=0);re t u rn t e m p p t r;)1 2 .已知S t ri n g 类定义如下:c l a ss S t ri n g(p u b l i c:S t ri n g (c o n st c h a r*st r=N UL L);/通用构造函数S t ri n g (c o n st S t ri n g f e a n o t h e r);/拷贝构造函数 S t ri n g O;/析构函数S t ri n g&o p e ra t e r=(c o n st S t ri n g&rh s);/赋值函数p ri v a t e:c h a r*m _ d a

33、 t a;/用于保存字符串);尝试写出类的成员函数实现。答案:S t ri n g:S t ri n g(c o n st c h a r*st r)i f (st r=N UL L )st rl e n 在参数为N UL L 时会抛异常才会有这步判断m d a t a =n e w c h a r 1;m _ d a t a 0 =0 ;)e l sem _ d a t a =n e w c h a r st rl e n(st r)+1;st rc p y(m d a t a,st r);)S t ri n g:S t ri n g(c o n st S t ri n g&a n o t

34、h e r)(m _ d a t a =n e w c h a r st rl e n(a n o t h e r.m _ d a t a)+1;st rc p y(m _ d a t a,o t h e r.m _ d a t a);)S t ri n g&S t ri n g:o p e ra t o r=(c o n st S t ri n g&rh s)(i f (t h i s=&rh s)re t u rn *t h i s;d e l e t e m _ d a t a;删除原来的数据,新开一块内存m d a t a =n e w c h a r st rl e n(rh s.m

35、 d a t a)+1;st rc p y(m _ d a t a,rh s.m _ d a t a);re t u rn *t h i s;)S t ri n g:f S t ri n g O(d e l e t e m _ d a t a ;)1 3,.h头文件中的i f n d e f/d e f i n e/e n d i f 的作用?答:防止该头文件被重复引用。1 4.#i n c l u d e 与#i n c l u d e f i l e.h”的区别?答:前者是从S t a n d a rd L i b ra ry的路径寻找和引用f i l e.h,而后者是从当前工作路径搜寻并

36、引用f i l e.h o1 5.在 C+程序中调用被C编译器编译后的函数,为什么要加e xt e rn “C”?首先,作为e xt e rn 是 C/C+语言中表明函数和全局变中作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用,e xt e rn 是连接申明(l i n k a g e d e c l a ra t i o n),被 e xt e rn 修饰的变量和函数是按照C语言方式编译和连接的,来看看C+中对类似C的函数是怎样编译的:作为一种面向对象的语言,C+支持函数重载,而过程式语言C则不支持。函数被C+编译后在符号库中的名字与C语言的不

37、同。例如,假设某个函数的原型为:v o i d f o o(i n t x,i n t y);该函数被C编译器编译后在符号库中的名字为_ f。,而 C+编译器则会产生像一f o o _ i n t _ i n t之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字 称 为 m a n g l e d n a m e)。_ f o o _ i n t _ i n t 这样的名字包含了函数名、函数参数数量及类型信息,C+就是靠这种机制来实现函数重载的。例如,在 C+中,函数v o i d f o o(i n t x,i n t y)与 v o i d f o o(i n

38、 t x,f l o a t y)编译生成的符号是不相同的,后者为_ f o o _ i n t _ f l o a t。同 样 地,C+中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以.来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。未加e xt e rn C 声明时的连接方式假设在C+中,模块A的头文件如下:模 块 A头 文 件 m o d u l e A.h#i f n d e f M 0 D UL E _ A _ H#d e f i n e

39、 M 0 D UL E _ A _ Hi n t f o o(i n t x,i n t y);A e n d i f在模块B中引用该函数:/模块B实 现 文 件 m o d u l e B.c p p#i n c l u d e m o d u l e A.h f o o (2,3);实际上,在连接阶段,连接器会从模块A生成的目标文件m o d u l e A.o b j 中寻找_ f o o _ i n t _ i n t这样的符号!加 e xt e rn 声明后的编译和连接方式加 e xt e rn 声明后,模块A的头文件变为:/模块A头 文 件 m o d u l e A.ht t i

40、 f n d e f M 0 D UL E _ A _ H d e f i n e M 0 D UL E _ A _ He xt e rn C i n t f o o(i n t x,i n t y);t t e n d i f在模块B的实现文件中仍然调用f o o(2,3 ),其结果是:(1)模块A编译生成f o。的目标代码时,没有对其名字进行特殊处理,采用了 C 语言的方式;(2)连接器在为模块B的目标代码寻找f o o(2,3)调用时,寻找的是未经修改的符号名_ f。如果在模块A中函数声明了 f o o 为 e xt e rn C”类型,而模块B中包含的是e xt e rn i n tf

41、 o o(i n t x,i n t y),则模块B找不到模块A中的函数;反之亦然。所 以,可以用一句话概括e xt e rn “C”这个声明的真实目的(任何语宣中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C+与 C及其它语言的混合编程。明白了 C+中 e xt e rn 的设立动机,我们下面来具体分析e xt e rn C 通常的使用技巧:e xt e rn 的惯用法(1)在 C+中引用C 语言中的函数和变量,在包含C语言头文件(假设为c E

42、 xa m p l e.h)时,需进行下列处理:e xt e rn(#i n c l u d e *c E xa m p l e.h)而在C语言的头文件中,对其外部函数只能指定为e xt e rn 类型,C语言中不支持e xt e rn声明,在.c 文件中包含了 e xt e rn C 时会出现编译语法错误。C+引用C函数例子工程中包含的三个文件的源代码如下:/*c 语言头文件:c E xa m p l e.h */#i f n d e f C _ E X A M P L E _ Ht t d e f i n e C _ E X A M P L E _ He xt e rn i n t a d

43、 d(i n t x,i n t y);t t e n d i f/*c语言实现文件:c E xa m p l e.c */#i n c l u d e *c E xa m p l e.h i n t a d d(i n t x,i n t y)(re t u rn x+y;/c+实现文件,调用 a d d:c p p F i l e.c p pe xt e rn C(#i n c l u d e c E xa m p l e.h i n t m a i n(i n t a rg c,c h a r*a rg v )(a d d (2,3);re t u rn 0;)如果C+调用一个C 语言编

44、写的.D L L 时,当包括.D L L 的头文件或声明接口函数时,应加e xt e rn C (2)在 C中引用C+语言中的函数和变量时,C+的头文件需添加e xt e rn C,但是在C语言中不能直接引用声明了 e xt e rn 的该头文件,应该仅将C文件中将C+中定义的e xt e rn C”函数声明为e xt e rn 类型。C引用C+函数例子工程中包含的三个文件的源代码如下:/C+头文件 c p p E xa m p l e.h#i f n d e f C P P _ E X A M P L E _ Hf t d e f i n e C P P _ E X A M P L E _

45、He xt e rn C i n t a d d(i n t x,i n t y);#e n d i fC+实现文件 c p p E xa m p l e.c p p#i n c l u d e c p p E xa m p l e,h”i n t a d d(i n t x,i n t y)(re t u rn x+y;)/*C实现 文 件 c F i l e.c/*这样会编译出错:#i n c l u d e c E xa m p l e.h */e xt e rn i n t a d d(i n t x,i n t y);i n t m a i n(i n t a rg c,c h a

46、r*a rg v )(a d d(2,3 );re t u rn 0;)1 5 题目的解答请参考 清+中 e xt e rn “C”含义深层探索注解1 6 .关联、聚合(A g g re g a t i o n)以及组合(C o m p o si t i o n)的区别?涉及到UM L 中的一些概念:关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示h a s-a 的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:从实现的角度讲,聚合可以表示为:c l a ss A .c l a ss B A*a;.而组合表示c o n

47、t a i n s-a 的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形表示组合关系:实现的形式是:c l a s s A .c l a s s B A a;.参考文章:h t t p:b l o g,c s d n.n e t/wf wd/a r c h i ve/2 0 0 6/0 5/3 0/7 6 3 7 5 3.a s p xh t t p:/b l o g.c s d n.n e t/wf wd/a r c h i ve/2 0 0 6/0 5/3 0/7 6 3 7 6 0.a s p x1 7 .面向对象的三个基本特征,并简单叙述

48、之?1 .封装:将客观事物抽象成类,每个类对自身的数据和方法实行p r o t e c t i o n(p r i va t e,p r o t e c t e d,p u b l i c)2 .继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能 力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=接口继承以及纯虚函数)构成了功能复用的两种方式。3.多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

49、简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。1 8.重 载(o ve r l o a d)和重写(o ve r r i e d,有的书也叫做“覆盖”)的区别?常考的题目。从定义上来说:重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重写:是指子类重新定义复类虚函数的方法。从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:f u n c t i o nf u n c(p:i n t e g e r):i n

50、 t e g e r;和 f u n c t i o n f u n c (p:s t r i n g):i n t e g e r;,那么编译器做过修饰后的函数名称可能是这样的:i n t f u n c、s t r f u n c 对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)

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

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁