《华为C++笔试题及答案教学文案.doc》由会员分享,可在线阅读,更多相关《华为C++笔试题及答案教学文案.doc(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Good is good, but better carries it.精益求精,善益求善。华为C+笔试题及答案-1.static有什么用途?(请至少说明两种)1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用2.引用与指针有什么区别?1)引用必须被初始化,指针不必。2)引用初始化以后不能被改变,指针可以改变所指的对象。3)不
2、存在指向空值的引用,但是存在指向空值的指针。3.描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性。4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈。5.什么是平衡二叉树?左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。6.堆栈溢出一般是由什么原因导致的?没有回收垃圾资源。7.什么函数不能声明为虚函数?constructor函数不能声明为虚函数。8.冒泡排序算法的时间复杂度是什么?时间复杂度是O(n2)。9.写出floatx与“零值”比较的if语句。if(x0.000001&x-0.000001)10.Intern
3、et采用哪种网络协议?该协议的主要层次结构?Tcp/Ip协议主要层次结构为:应用层/传输层/网络层/数据链路层/物理层。11.Internet物理地址和IP地址转换采用什么协议?ARP(AddressResolutionProtocol)(地址解析協議)12.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。循环链表,用取余操作做14.不能做switch()的参数类型是:switch的参数不能为实型。1.以下三条输出
4、语句分别输出什么?C易charstr1=abc;charstr2=abc;constcharstr3=abc;constcharstr4=abc;constchar*str5=abc;constchar*str6=abc;coutboolalpha(str1=str2)endl;/输出什么?0coutboolalpha(str3=str4)endl;/输出什么?0coutboolalpha(str5=str6)endl;/输出什么?12.非C+内建型别A和B,在哪几种情况下B能隐式转化为A?C+中等答:a.classB:publicA/B公有继承自A,可以是间接继承的b.classBopera
5、torA();/B实现了隐式转化为A的转化c.classAA(constB&);/A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数d.A&operator=(constA&);/赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个3.以下代码中的两个sizeof用法有问题吗?C易voidUpperCase(charstr)/将str中的小写字母转换成大写字母for(size_ti=0;isizeof(str)/sizeof(str0);+I)if(a=stri&stri=z)stri-=(a-A);charstr=aBcDe;coutstr字符长度为:sizeo
6、f(str)/sizeof(str0)endl;UpperCase(str);coutstr9)ch+=(A-9-1);charcl=c%0x10+0;if(cl9)cl+=(A-9-1);coutchcl;charstr=Ilove中国;for(size_ti=0;istrlen(str);+I)char2Hex(stri);coutendl;5.以下代码有什么问题?C+易structTestTest(int)Test()voidfun();voidmain(void)Testa(1);a.fun();Testb();答:Testb;b.fun();6.以下代码有什么问题?C+易cout(t
7、rue?1:1)temp;unsignedintconstsize2=temp;charstr2size2;答:不能用变量给const常量赋值8.以下代码中的输出语句输出0吗,为什么?C+易structCLSintm_i;CLS(intI):m_i(i)CLS()CLS(0);答:在CLS()中CLS(0)创建了另一个对象,所以并没有对obj对象进行赋值,而是其他对象赋值。;CLSobj;coutobj.m_iendl;不能,因为m_i没有初始化,会付一个很大的数,不太懂9.C+中的空类,默认产生哪些类成员函数?C+易答:classEmptypublic:Empty();/缺省构造函数Empt
8、y(constEmpty&);/拷贝构造函数Empty();/析构函数Empty&operator=(constEmpty&);/赋值运算符Empty*operator&();/取址运算符constEmpty*operator&()const;/取址运算符const;10.以下两条输出语句分别输出什么?C+难floata=1.0f;cout(int)aendl;cout(int&)aendl;不懂!coutboolalpha(int)a=(int&)a)endl;/输出什么?Floatb=0.0f;cout(int)bendl;cout(int&)bendl;coutboolalpha(int
9、)b=(int&)b)endl;/输出什么?11.以下反向遍历array数组的方法有什么错误?STL易vectorarray;(vector没有给定具体类型也没有说明是模板类型)size_type是无符号整数,当j=0时,做减1操作不会得到-1,而是得到最大的无符号整数,因此永远不会退出循环答:vectorarray(100);array.push_back(1);array.push_back(2);array.push_back(3);for(vector:size_typei=array.size()-1;i=0;-i)/反向遍历array数组coutarrayiendl;12.以下代码
10、有什么问题?STL易typedefvectorIntArray;IntArrayarray;array.push_back(1);array.push_back(2);array.push_back(2);array.push_back(3);/删除array数组中所有的2for(IntArray:iteratoritor=array.begin();itor!=array.end();+itor)if(2=*itor)array.erase(itor);其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行iter+是肯定会出错
11、的。13.写一个函数,完成内存之间的拷贝。考虑问题是否全面答:void*mymemcpy(void*dest,constvoid*src,size_tcount)char*pdest=static_cast(dest);constchar*psrc=static_cast(src);if(pdestpsrc&pdestpsrc+cout)能考虑到这种情况就行了判断拷贝是否有重叠区正确的拷贝for(size_ti=count-1;i!=-1;-I)pdesti=psrci;elsefor(size_ti=0;icount;+I)pdesti=psrci;returndest;intmain(vo
12、id)charstr=0123456789;mymemcpy(str+1,str+0,9);coutstr_fun,main=_main但是C+中函数名与得到的汇编代号有比较大的差别。如:由于函数重载,函数名一样,但汇编代号绝对不能一样。为了区分,编译器会把函数名和参数类型合在一起作为汇编代号,这样就解决了重载问题。具体如何把函数名和参数类型合在一起,要看编译器的帮助说明了。这样一来,如果C+调用C,如fun(),则调用名就不是C的翻译结果_fun,而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决这个问题,加上externC表示该函数的调用规则是C的规则,则调用时就不使用C+规
13、则的带有参数信息的名字,而是_fun,从而达到调用C函数的目的。5、请简述以下两个for循环的优缺点/第一个for(i=0;i+;)if(condition)DoSomething();elseDoOtherthing();/优点:缺点第二个if(condition)for(i=0;i+;)DoSomething();elsefor(i=0;i+;)DoOtherthing();:优点:缺点:四、有关内存的思考题(20分)voidGetMemory(char*p)p=(char*)malloc(100);/没有free的操作肯定会造成内存泄漏voidTest(void)char*str=NUL
14、L;GetMemory(str);strcpy(str,helloworld);printf(str);请问运行Test函数会有什么样的结果?答:char*GetMemory(void)charp=helloworld;/存储在stack中,但是stack中的变量在完成function之后会自动释放,所以也会返回一个野指针returnp;voidTest(void)char*str=NULL;str=GetMemory();printf(str);请问运行Test函数会有什么样的结果?答:VoidGetMemory2(char*p,intnum)*p=(char*)malloc(num);vo
15、idTest(void)char*str=NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);请问运行Test函数会有什么样的结果?答:voidTest(void)char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL)strcpy(str,“world”);printf(str);请问运行Test函数会有什么样的结果?world答:五、编写strcpy函数(10分)已知strcpy函数的原型是:char*strcpy(char*strDest,con
16、stchar*strSrc)其中strDest是目的字符串,strSrc是源字符串。(1)不调用C+/C的字符串库函数,请编写函数strcpy(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?为了实现链式表达式。char*strcpy(char*strDest,constchar*strSrc)assert(strDest!=NULL)&(strSrc!=NULL);char*address=strDest;while(*strDest+=*strSrc+)!=0);returnaddress;从函数中返回函数体内分配的内存是十分危险的做法,他把释
17、放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。六、编写类String的构造函数、析构函数和赋值函数(25分)已知类String的原型为:classStringpublic:String(constchar*str=NULL);/普通构造函数String(constString&other);/拷贝构造函数String(void);/析构函数String&operate=(constString&other);/赋值函数private:char*m_data;/用于保存字符串;请编写String的上述4个函数。附录C:C+/C试题的答案与评分标准一、请填写B
18、OOL,float,指针变量与“零值”比较的if语句。(10分)请写出BOOLflag与“零值”比较的if语句。(3分)标准答案:if(flag)if(!flag)constfloatEPSINON=0.00001;if(x=-EPSINON)&(xnext=NULL;p=h;for(i=0;inext=s;printf(Pleaseinputtheinformationofthestudent:namesexnoagen);scanf(%s%c%d%d,s-name,&s-sex,&s-no,&s-age);s-next=NULL;p=s;printf(Createsuccessful!);
19、return(h);voiddeletelist(structstu*s,inta)structstu*p;while(s-age!=a)p=s;s=s-next;if(s=NULL)printf(Therecordisnotexist.);elsep-next=s-next;printf(Deletesuccessful!);voiddisplay(structstu*s)s=s-next;while(s!=NULL)printf(%s%c%d%dn,s-name,s-sex,s-no,s-age);s=s-next;intmain()structstu*s;intn,age;printf(
20、Pleaseinputthelengthofseqlist:n);scanf(%d,&n);s=creatlist(n);display(s);printf(Pleaseinputtheage:n);scanf(%d,&age);deletelist(s,age);display(s);return0;2、实现一个函数,把一个字符串中的字符从小写转为大写。程序代码Includestdio.hIncludeconio.hvoiduppers(char*s,char*us)for(;*s!=0;s+,us+)if(*s=a&*s=z)*us=*s-32;else*us=*s;*us=0;intma
21、in()char*s,*us;charss20;printf(Pleaseinputastring:n);scanf(%s,ss);s=ss;uppers(s,us);printf(Theresultis:n%sn,us);getch();1进程和线程的差别。2.测试方法3Heap与stack的差别。4Windows下的内存是如何管理的?5介绍.Net和.Net的安全性。6客户端如何访问.Net组件实现WebService?7C/C+编译器中虚表是如何完成的?8谈谈COM的线程模型。然后讨论进程内/外组件的差别。9谈谈IA32下的分页机制10给两个变量,如何找出一个带环单链表中是什么地方出现环的?11在IA32中一共有多少种办法从用户态跳到内核态?12如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?13如何截取键盘的响应,让所有的a变成b?14Apartment在COM中有什么用?为什么要引入?15存储过程是什么?有什么用?有什么优点?16Template有什么特点?什么时候用?17谈谈WindowsDNA结构的特点和优点。18.网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?-