2023年C++常见笔试题及答案_第1页
2023年C++常见笔试题及答案_第2页
2023年C++常见笔试题及答案_第3页
2023年C++常见笔试题及答案_第4页
2023年C++常见笔试题及答案_第5页
已阅读5页,还剩136页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++面试题1#include“filename.h”和#include<filename.h>的区别?答:对于#include<filename.h>编译器从标准库开始搜索filename.h对于#include“filename.h”编译器从用户工作途径开始搜索filename.h2头文献的作用是什么?答:一、通过头文献来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文献和二进制的库即可。用户只需要按照头文献中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。二、头文献能加强类型安全检查。假如某个接口被实现或被使用时,其方式与头文献中的声明不一致,编译器就会指犯错误,这一简朴的规则,能大大减轻程序员调试、改错的承担。3C++函数中值的传递方式有哪几种?答:C++函数的三种传递方式为:值传递、指针传递和引用传递。4内存的分派方式有几种?答:一、从静态存储区域分派。内存在程序编译的时候就已经分派好,这块内存在程序的整个运营期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分派运算内置于解决器的指令集中,效率很高,但是分派的内存容量有限。三、从堆上分派,亦称动态内存分派。程序在运营的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。5实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;答:双向链表删除一个节点Ptemplate<classtype>voidlist<type>::delnode(intp){intk=1;listnode<type>*ptr,*t;ptr=first;while(ptr->next!=NULL&&k!=p){ptr=ptr->next;k++;}t=ptr->next;cout<<"你已经将数据项"<<t->data<<"删除"<<endl;ptr->next=ptr->next->next;length--;deletet;}在节点P后插入一个节点:template<classtype>boollist<type>::insert(typet,intp){listnode<type>*ptr;ptr=first;intk=1;while(ptr!=NULL&&k<p){ptr=ptr->next;k++;}if(ptr==NULL&&k!=p)returnfalse;else{listnode<type>*tp;tp=newlistnode<type>;tp->data=t;tp->next=ptr->next;ptr->next=tp;length++;returntrue;}}6写一个函数,将其中的\t都转换成4个空格。boolchange(char*buf,intlen){ﻩintcount=0; inti; //记录有多少个'\t'ﻩfor(i=0;buf[i]!='\0';i++){ﻩﻩif(buf[i]=='\t')ﻩ count++; }ﻩ//给定的buf空间是否能装下生成的字符串ﻩintj=i+3*count; if(len<j+1)ﻩﻩreturnfalse; //从后向前逐个替换 while(count>0)ﻩ{ while(buf[i]!='\t') ﻩ buf[j--]=buf[i--];ﻩﻩcount--;ﻩﻩbuf[j]=buf[j-1]=buf[j-2]=buf[j-3]=''; j-=4;ﻩﻩi--; }ﻩreturntrue;}intmain(){ charbuf[100]="123\t45\t\t\t6\t\t65\n4234\t5345"; cout<<"Beforechage:"<<endl; cout<<buf<<endl;ﻩcout<<"Aftercallingthefunction:"<<endl; //buf是原字符串,100是buf的长度(要足够大,最佳是原字符串的3倍) if(change(buf,100)==true) ﻩcout<<buf<<endl;ﻩcharc; cin>>c;}7Windows程序的入口是哪里?写出Windows消息机制的流程.函数WinMain()Windows应用程序的消息解决机制如图1.2所示。(1)操作系统接受到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。(2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预解决,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。(3)应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表达的,其中就包含了接受消息的窗口的句柄。因此,DispatchMessage函数总能进行对的的传递。(4)系统运用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行解决(即“系统给应用程序发送了消息”)。8如何定义和实现一个类的成员函数为回调函数?把函数声明为static9C++里面是不是所有的动作都是main()引起的?假如不是,请举例.答:在运营c++程序时,通常从main()函数开始执行。因此假如没有main(),程序将不完整,编译器将指出未定义main()函数。例外情况:如,在windows编程中,可以编写一个动态连接库(dll)模块,这是其他windows程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main().用于专用环境的程序--如机器人中的控制器芯片--也许不需要main().但常规的独立程序都需要main().10C++里面如何声明constvoidf(void)函数为C程序中的库函数?extern"C"voidf(void);11下列哪两个是等同的C==Dintb;Aconstint*a=&b;Bconst*inta=&b;Cconstint*consta=&b;Dintconst*consta=&b;12内联函数在编译时是否做参数类型检查是13三个float:a,b,c问值(a+b)+c==(b+a)+c1(a+b)+c==(a+c)+b114把一个链表反向填空voidreverse(test*head){test*pe=head;test*ps=head->next;while(ps){pe->next=ps->next;ps->next=head;head=ps;ps=pe->next;}}16某个程序在一个嵌入式系统(200M的CPU,50M的SDRAM)中已经最化了,换到另一个系统(300M的CPU,50M的SDRAM)中运营,还需要优化吗?要。程序在每时每刻都要优化,只要能找到可以优化的方法。优化有多种目的,在200M的CPU中也许需要以速度为重点优化,在300M的CPU中也许要以代码长度为目的优化。17.下面哪种排序法对12354最快Caquicksort//快速排序b.bublesort//冒泡排序c.mergesort//归并排序18.哪种结构,平均来讲,获取一个值最快Ba.binarytree//二叉树b.hashtable//散列表,哈希表c.stack//栈19请问C++的类和C里面的struct有什么区别?答:c++的类的成员默认情况下是私有的,c的struct的成员默认情况下是公共的.20请讲一讲析构函数和虚函数的用法和作用?答:析构函数的名字和类名相同,没有返回值,没有参数,不能随意调用也没有重载。只是在类对象生命期结束时由系统自动调用。虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联编。21全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?答:一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区.22一些寄存器的题目,重要是寻址和内存管理等一些知识。1、立即寻址2、寄存器寻址3、直接寻址4、寄存器间接寻址5、基址加变址寻址6、寄存器相对寻址7、相对基址加变址寻址238086是多少位的系统?在数据总线上是怎么实现的?8086有16根数据线和20根地址线,由于可用20位地址.8086是16位解决器.24多态。overload和override的区别。答:多态:接口的多种不同的实现方式即为多态重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无。覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字。<<Sony笔试题>>25.完毕下列程序**.*.*..*..*..*...*...*...*...*....*....*....*....*....*.....*.....*.....*.....*.....*.....*......*......*......*......*......*......*......*.......*.......*.......*.......*.......*.......*.......*.......#include<iostream>usingnamespacestd;constintn=8;main(){inti;intj;intk;for(i=n;i>=1;i--){for(j=0;j<n-i+1;j++){cout<<"*";for(k=1;k<n-i+1;k++){cout<<".";}}cout<<endl;}system("pause")}26完毕程序,实现对数组的降序排序#include<iostream>usingnamespacestd;voidsort(int*arr,intn);intmain(){intarray[]={45,56,76,234,1,34,23,2,3};sort(array,9);for(inti=0;i<=8;i++)//曾经在这儿出界cout<<array[i]<<"";cout<<endl;system("pause");}voidsort(int*arr,intn){inttemp;for(inti=1;i<9;i++){for(intk=0;k<9-i;k++)//曾经在这儿出界{if(arr[k]<arr[k+1]){temp=arr[k];arr[k]=arr[k+1];arr[k+1]=temp;}}}}27费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他方法,但要说明你选择的理由。非递归#include<iostream>usingnamespacestd;intPheponatch(intn);main(){intPh=Pheponatch(10);cout<<Ph<<endl;system("pause");}intPheponatch(intn){intelem;intn1=1;intn2=1;if(n==1||n==2)return1;else{for(inti=3;i<=n;i++){elem=n1+n2;n1=n2;n2=elem;}returnelem;}}递归#include<iostream>usingnamespacestd;intPheponatch(intn);main(){intn;cin>>n;intph=Pheponatch(n);cout<<ph<<endl;system("pause");}intPheponatch(intn){if(n<=0)exit(-1);elseif(n==1||n==2)return1;elsereturnPheponatch(n-1)+Pheponatch(n-2);}28下列程序运营时会崩溃,请找犯错误并改正,并且说明因素。#include<stdio.h>#include<malloc.h>typedefstruct{TNode*left;TNode*right;intvalue;}TNode;TNode*root=NULL;voidappend(intN);intmain(){append(63);append(45);append(32);append(77);append(96);append(21);append(17);//Again,数字任意给出}voidappend(intN){TNode*NewNode=(TNode*)malloc(sizeof(TNode));NewNode->value=N;if(root==NULL){root=NewNode;return;}else{TNode*temp;temp=root;while((N>=temp.value&&temp.left!=NULL)||(N<temp.value&&temp.right!=NULL)){while(N>=temp.value&&temp.left!=NULL)temp=temp.left;while(N<temp.value&&temp.right!=NULL)temp=temp.right;}if(N>=temp.value)temp.left=NewNode;elsetemp.right=NewNode;return;}}29.AclassBnetworkontheinternethasasubnetmaskof255.255.240.0,whatisthemaximumnumberofhostspersubnet.a.240b.255c.4094d.6553430.Whatisthedifference:betweeno(logn)ando(logn^2),wherebothlogarithemshavebase2.a.o(logn^2)isbiggerb.o(logn)isbiggerc.nodifference31.Foraclasswhatwouldhappenifwecallaclass’sconstructorfromwiththesameclass’sconstructor.a.compilationerrorb.linkingerrorc.stackoverflowd.noneoftheabove32.“new”inc++isa:.a.libraryfunctionlikemallocincb.keywordc.operatord.noneoftheabove33.Whichofthefollowinginformationisnotcontainedinaninode.a.fileownerb.filesizec.filenamed.diskaddress34.What’sthenumberofcomparisonsintheworstcasetomergetwosortedlistscontainingnelementseach.a.2nb.2n-1c.2n+1d.2n-235.TimecomplexityofnalgorithmT(n),wherenistheinputsize,isT(n)=T(n-1)+1/nifn>1otherwise1theorderofthisalgorithmis.a.log(n)b.nc.n^2d.n^n36.Thenumberof1’sinthebinaryrepresentationof3*4096+15*256+5*16+3are.a.8b.9c.10d.1237.设计函数intatoi(char*s)。38.inti=(j=4,k=8,l=16,m=32);printf(“%d”,i);输出是多少?39.解释局部变量、全局变量和静态变量的含义。40.解释堆和栈的区别。栈区(stack)—由编译器自动分派释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆:一般由程序员分派释放,若程序员不释放,程序结束时也许由OS回收。注意它与数据结构中的堆是两回事,分派方式倒是类似于链表.41.论述含参数的宏与函数的优缺陷。1.函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简朴的字符替换。2.函数调用是在程序运营时解决的,分派临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分派内存单元,不进行值的传递解决,也没有“返回值”的概念。3.对函数中的实参和形参都要定义类型,两者的类型规定一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。宏定义时,字符串可以是任何类型的数据。4.调用函数只可得到一个返回值,而用宏可以设法得到几个结果。5.使用宏次数多时,宏展开后源程序长,由于每展开一次都使程序增长,而函数调用不使源程序变长。6.宏替换不占运营时间,只占编译时间;而函数调用则占运营时间(分派单元、保存现场、值传递、返回)。一般来说,用宏来代表简短的表达式比较合适。42.以下三条输出语句分别输出什么?[C易]charstr1[]="abc";charstr2[]="abc";constcharstr3[]="abc";constcharstr4[]="abc";constchar*str5="abc";constchar*str6="abc";cout<<boolalpha<<(str1==str2)<<endl;//输出什么?0cout<<boolalpha<<(str3==str4)<<endl;//输出什么?0cout<<boolalpha<<(str5==str6)<<endl;//输出什么?1答:分别输出false,false,true。和都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和同上,只是按conststr5和abc们自己仅是指向该区首地址的指针,相43.非C++内建型别A和B,在哪几种情况下B能隐式转化为A?[C++中档]答:BDa.classB:publicA{……}//B公有继承自A,可以是间接继承的b.classB{operatorA();}//B实现了隐式转化为A的转化c.classA{A(constB&);}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数d.A&operator=(constA&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个44.以下代码中的两个sizeof用法有问题吗?[C易]voidUpperCase(charstr[])//将str中的小写字母转换成大写字母{for(size_ti=0;i<sizeof(str)/sizeof(str[0]);++i)if('a'<=str[i]&&str[i]<='z')str[i]-=('a'-'A');}charstr[]="aBcDe";cout<<"str字符长度为:"<<sizeof(str)/sizeof(str[0])<<endl;UpperCase(str);cout<<str<<endl;45.以下代码有什么问题?[C难]voidchar2Hex(charc)//将字符以16进制表达{charch=c/0x10+'0';if(ch>'9')ch+=('A'-'9'-1);charcl=c%0x10+'0';if(cl>'9')cl+=('A'-'9'-1);cout<<ch<<cl<<'';}charstr[]="Ilove中国";for(size_ti=0;i<strlen(str);++i)char2Hex(str[i]);cout<<endl;46.以下代码有什么问题?[C++易]structTest{Test(int){}Test(){}voidfun(){}};voidmain(void){Testa(1);a.fun();Testb();b.fun();}***Testb();//定义了一个函数47.以下代码有什么问题?[C++易]cout<<(true?1:"1")<<endl;8.以下代码可以编译通过吗,为什么?[C++易]unsignedintconstsize1=2;charstr1[size1];unsignedinttemp=0;cin>>temp;unsignedintconstsize2=temp;charstr2[size2];48.以下代码中的输出语句输出0吗,为什么?[C++易]structCLS{intm_i;CLS(inti):m_i(i){}CLS(){CLS(0);}};CLSobj;cout<<obj.m_i<<endl;49.C++中的空类,默认产生哪些类成员函数?[C++易]答:classEmpty{public:Empty();//缺省构造函数Empty(constEmpty&);//拷贝构造函数~Empty();//析构函数Empty&operator=(constEmpty&);//赋值运算符Empty*operator&();//取址运算符constEmpty*operator&()const;//取址运算符const};50.以下两条输出语句分别输出什么?[C++难]floata=1.0f;cout<<(int)a<<endl;cout<<(int&)a<<endl;cout<<boolalpha<<((int)a==(int&)a)<<endl;//输出什么0floatb=0.0f;cout<<(int)b<<endl;cout<<(int&)b<<endl;cout<<boolalpha<<((int)b==(int&)b)<<endl;//输出151.以下反向遍历array数组的方法有什么错误?[STL易]vectorarray;array.push_back(1);array.push_back(2);array.push_back(3);for(vector::size_typei=array.size()-1;i>=0;--i)//反向遍历array数组{cout<<array[i]<<endl;}52.以下代码有什么问题?[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);}53.写一个函数,完毕内存之间的拷贝。[考虑问题是否全面]答:void*mymemcpy(void*dest,constvoid*src,size_tcount){char*pdest=static_cast<char*>(dest);constchar*psrc=static_cast<constchar*>(src);if(pdest>psrc&&pdest<psrc+cout)能考虑到这种情况就行了{for(size_ti=count-1;i!=-1;--i)pdest[i]=psrc[i];}else{for(size_ti=0;i<count;++i)pdest[i]=psrc[i];}returndest;}intmain(void){charstr[]="";mymemcpy(str+1,str+0,9);cout<<str<<endl;system("Pause");return0;}54线程与进程的区别进程就是一个应用程序在解决机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运营。55:请你分别划划OSI(开放式系统互联)的七层网络结构图,和TCP/IP的五层结构图?56:请你具体的解释一下IP协议的定义,在哪个层上面,重要有什么作用?TCP与UDP呢?IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,重要考虑到很多应用不需要可靠的连接,但需要快速的传输57:请问互换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?互换机用在局域网中,互换机通过记录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地址。路由器辨认不同网络的方法是通过辨认不同网络的网络ID号(IP地址的高端部分)进行的,所认为了保证路由成功,每个网络都必须有一个唯一的网络编号。路由器通过察看报文中IP地址,来决定途径,向那个子网(下一跳)路由,也就是说互换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地址但是由于现在网络设备的发展,很多设备既有互换机的功能有由路由器的功能(互换试路由器)使得两者界线越来越模糊。58:请问C++的类和C里面的struct有什么区别?HYPERLINK"++%E7%B1%BB&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YYm1FbP1RYnHw-n1K9mvns0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW61Pj0vn16k"\t""C++类中属性默认访问类型为private,而C中的struct默认的访问类型为publicﻫ(2)c++类可以有继承,虚函数,多态,而C中struct不可以。C++的class具有数据封装功能,其包含属性访问级别可认为private,public和protect,还具有实现类接口功能和辅助功能的操作函数,而struct属性访问权限只有public,没有数据封装功能,也就没有实现信息隐藏这一面向对象的思想的机制,struct自身不具有操作函数,只有数据。59:请讲一讲析构函数和虚函数的用法和作用?析构函数是在类对象死亡时由系统自动调用,其作用是用来释放对象的指针数据成员所指的动态空间,假如在构造函数中,你申请了动态空间,那么为了避免引起程序错误,你必须在析构函数中释放这部分内存空间。假如基类的函数用virtual修饰,成为虚函数,则其派生类相应的重载函数仍能继承该虚函数的性质,虚函数进行动态联编,也即具有多态性,也就是派生类可以改变基类同名函数的行为,在面向对象世界中,多态是最强大的机制,虚函数就是这一机制的c++实现方式。60:全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运营到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。全局变量分派在全局数据段并且在程序开始运营的时候被加载.局部变量则分派在堆栈里面。61:一些寄存器的题目,重要是寻址和内存管理等一些知识。2、互换机用在局域网中,互换机通过纪录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地质。路由器辨认不同网络的方法是通过辨认不同网络的网络ID号(IP地址的高端部分)进行的,所认为了保证路由成功,每个网络都必须有一个唯一的网络编号。路由器通过察看报文中IP地址,来决定途径,向那个子网(下一跳)路由,也就是说互换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地质但是由于现在网络设备的发展,很多设备既有互换机的功能有由路由器的功能(互换试路由器)使得两者界线越来越模糊。3、IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,重要考虑到很多应用不需要可靠的连接,但需要快速的传输。4、Testb();//定义了一个函数62:8086是多少位的系统?在数据总线上是怎么实现的?<<IBM>>63.如何用最快的方法判断链表是否有环?设立两个指针,开始都指向HYPERLINK""\t""链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,假如快的碰到NULL了,证明该链表中没有环,假如有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇,64.c++中引用和指针有什么不同?指针加上什么限制等于引用?答:1引用被创建的时候必须被初始化,而指针不是必需的。2引用在创建后就不能改变引用的关系,而指针在初始化后可以随时指向其它的变量或对象。3没有NULL引用,引用必须与合法的存储单元关联,而指针可以是NULL。65.做的项目,碰到的困难,如何解决?69.操作符重载classCMyObject:pulicCObject{Public:CMyObject();CMyObject&operator=(constCMyObject&my);private:CStringstrName;intnId:};请重载赋值操作符70.链表StructstructList{intvalue;structList*pHead;}StructLinkedList*pMyList;请编写删除链表的头、尾和第n个节点的程序71.用SocketAPI制作一个聊天程序,通讯协议使用tcp/ip。规定有简朴界面即可,支持多人聊天。72.假如有过工作经验,请说明在先前公司的工作以及离职因素(如无,请说明毕业后的个人展望)***************************************************************************73对于C++中类(class)与结构(struct)的描述对的的为:A,类中的成员默认是private的,当是可以声明为public,private和protected,结构中定义的成员默认的都是public;B,结构中不允许定义成员函数,当是类中可以定义成员函数;C,结构实例使用malloc()动态创建,类对象使用new操作符动态分派内存;D,结构和类对象都必须使用new创建;E,结构中不可以定义虚函数,当是类中可以定义虚函数.F,结构不可以存在继承关系,当是类可以存在继承关系.答:A,D,F74,两个互相独立的类:ClassA和ClassB,都各自定义了非静态的公有成员函数PublicFunc()和非静态的私有成员函数PrivateFunc();现在要在ClassA中增长定义一个成员函数ClassA::AdditionalPunction(ClassAa,ClassBb);则可以在AdditionalPunction(ClassAx,ClassBy)的实现部分(函数功能体内部)出现的合法的表达是最全的是:A,x.PrivateFunc();x.PublicFunc();y.PrivateFunc();y.PublicFunc();B,x.PrivateFunc();x.PublicFunc();y.PublicFunc();C,x.PrivateFunc();y.PrivateFunc();y.PublicFunc();D,x.PublicFunc();y.PublicFunc();答:B75,C++程序下列说法对的的有:A,对调用的虚函数和模板类都进行迟后编译.B,基类与子类中函数假如要构成虚函数,除了规定在基类中用virtual声名,并且必须名字相同且参数类型相同返回类型相同C,重载的类成员函数都必须要:或者返回类型不同,或者参数数目不同,或者参数序列的类型不同.D,静态成员函数和内联函数不能是虚函数,友员函数和构造函数也不能是虚函数,但是析构函数可以是虚函数.答:A***************************************************************************76,C++中的类与结构的区别?77,构造函数和析构函数是否可以被重载,为什么?答:构造函数可以被重载,析构函数不可以被重载。由于构造函数可以有多个且可以带参数,而析构函数只能有一个,且不能带参数。78,一个类的构造函数和析构函数什么时候被调用,是否需要手工调用?答:构造函数在创建类对象的时候被自动调用,析构函数在类对象生命期结束时,由系统自动调用。1#include“filename.h”和#include<filename.h>的区别?答:#include“filename.h”表白该文献是用户提供的头文献,查找该文献时从当前文献目录开始;#include<filename.h>表白这个文献是一个工程或标准头文献,查找过程会检查预定义的目录。2头文献的作用是什么?答:一、通过头文献来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文献和二进制的库即可。用户只需要按照头文献中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。二、头文献能加强类型安全检查。假如某个接口被实现或被使用时,其方式与头文献中的声明不一致,编译器就会指犯错误,这一简朴的规则能大大减轻程序员调试、改错的承担。3C++函数中值的传递方式有哪几种?答:C++函数的三种传递方式为:值传递、指针传递和引用传递。4内存的分派方式的分派方式有几种?答:一、从静态存储区域分派。内存在程序编译的时候就已经分派好,这块内存在程序的整个运营期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分派运算内置于解决器的指令集中,效率很高,但是分派的内存容量有限。三、从堆上分派,亦称动态内存分派。程序在运营的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。5实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;答:双向链表删除一个节点Ptemplate<classtype>voidlist<type>::delnode(intp){intk=1;listnode<type>*ptr,*t;ptr=first;while(ptr->next!=NULL&&k!=p){ptr=ptr->next;k++;}t=ptr->next;cout<<"你已经将数据项"<<t->data<<"删除"<<endl;ptr->next=ptr->next->next;length--;deletet;}在节点P后插入一个节点:template<classtype>boollist<type>::insert(typet,intp){listnode<type>*ptr;ptr=first;intk=1;while(ptr!=NULL&&k<p){ptr=ptr->next;k++;}if(ptr==NULL&&k!=p)returnfalse;else{listnode<type>*tp;tp=newlistnode<type>;tp->data=t;tp->next=ptr->next;ptr->next=tp;length++;returntrue;}}//上海贝尔的面试题43分即可进入复试一、请填写BOOL,float,指针变量与“零值”比较的if语句。(10分)提醒:这里“零值”可以是0,0.0,FALSE或者“空指针”。例如int变量n与“零值”比较的if语句为:if(n==0)if(n!=0)以此类推。请写出BOOLflag与“零值”比较的if语句:请写出floatx与“零值”比较的if语句:请写出char*p与“零值”比较的if语句:二、以下为WindowsNT下的32位C++程序,请计算sizeof的值(10分)charstr[]=“Hello”;char*p=str;intn=10;请计算sizeof(str)=sizeof(p)=sizeof(n)=voidFunc(charstr[100]){请计算sizeof(str)=}void*p=malloc(100);请计算sizeof(p)=、简答题(25分)1、头文献中的ifndef/define/endif干什么用?防止头文献反复定义。

#include<filename.h>和#include“filename.h”有什么区别?答:#include“filename.h”表白该文献是用户提供的头文献,查找该文献时从当前文献目录开始;#include<filename.h>表白这个文献是一个工程或标准头文献,查找过程会检查预定义的目录。const有什么用途?(请至少说明两种)在C/C++中,(1)可以定义const常量,(2)修饰函数的返回值和形参;

ﻫ在C++中,还可以修饰函数的定义体,定义类的const成员函数。被const修饰的东西受到强制保护,可以防止意外的变动,提高了程序的健壮性。在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言不同。假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接互换指定符号extern“C”来解决名字匹配问题。5、请简述以下两个for循环的优缺陷//第一个for(i=0;i<N;i++){if(condition)DoSomething();elseDoOtherthing();}//第二个if(condition){for(i=0;i<N;i++)DoSomething();}else{for(i=0;i<N;i++)DoOtherthing();}优点:N次中,每次都要对condition进行判断缺陷:优点:一次判断condition后,对something或Otherthing执行N次缺陷:四、有关内存的思考题(20分)voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,"helloworld");printf(str);}请问运营Test函数会有什么样的结果?char*GetMemory(void){charp[]="helloworld";returnp;}voidTest(void){char*str=NULL;str=GetMemory();printf(str);}请问运营Test函数会有什么样的结果?VoidGetMemory2(char**p,intnum){*p=(char*)malloc(num);}voidTest(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函数会有什么样的结果?五、编写strcpy函数(10分)已知strcpy函数的原型是char*strcpy(char*strDest,constchar*strSrc);其中strDest是目的字符串,strSrc是源字符串。(1)不调用C++/C的字符串库函数,请编写函数strcpychar*strcpy(char*strDest,constchar*strSrc){intn=0;while(strSrc[n]!=NULL){n++:}*srtDest=newchar[n];for(inti=0;i<n;i++){strDest=strSrc[i];i++;}return*strDest;}(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?由于该函数的还可以把复制的字符串首地址指针给其他的指针,并且这种需要也是有用的。六、编写类String的构造函数、析构函数和赋值函数(25分)已知类String的原型为:classString{public:String(constchar*str=NULL);//普通构造函数String(constString&other);//拷贝构造函数~String(void);//析构函数String&operate=(constString&other);//赋值函数private:char*m_data;//用于保存字符串};请编写String的上述4个函数。//答案一并给出一、请填写BOOL,float,指针变量与“零值”比较的if语句。(10分)请写出BOOLflag与“零值”比较的if语句。(3分)标准答案:if(flag)if(!flag)如下写法均属不良风格,不得分。if(flag==TRUE)if(flag==1)if(flag==FALSE)if(flag==0)请写出floatx与“零值”比较的if语句。(4分)标准答案示例:constfloatEPSINON=0.00001;if((x>=-EPSINON)&&(x<=EPSINON)不可将浮点变量用“==”或“!=”与数字比较,应当设法转化成“>=”或“<=”此类形式。如下是错误的写法,不得分。if(x==0.0)if(x!=0.0)请写出char*p与“零值”比较的if语句。(3分)标准答案:if(p==NULL)if(p!=NULL)如下写法均属不良风格,不得分。if(p==0)if(p!=0)if(p)if(!)二、以下为WindowsNT下的32位C++程序,请计算sizeof的值(10分)charstr[]=“Hello”;char*p=str;intn=10;请计算sizeof(str)=6(2分)sizeof(p)=4(2分)sizeof(n)=4(2分)voidFunc(charstr[100]){请计算sizeof(str)=4(2分)}void*p=malloc(100);请计算sizeof(p)=4(2分)三、简答题(25分)1、头文献中的ifndef/define/endif干什么用?(5分)答:防止该头文献被反复引用。2、#include<filename.h>和#include“filename.h”有什么区别?(5分)答:对于#include<filename.h>,编译器从标准库途径开始搜索filename.h对于#include“filename.h”,编译器从用户的工作途径开始搜索filename.h3、const有什么用途?(请至少说明两种)(5分)答:(1)可以定义const常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以防止意外的变动,能提高程序的健壮性。4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?(5分)答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接互换指定符号extern“C”来解决名字匹配问题。5、请简述以下两个for循环的优缺陷(5分)for(i=0;i<N;i++){if(condition)DoSomething();elseDoOtherthing();}if(condition){for(i=0;i<N;i++)DoSomething();}else{for(i=0;i<N;i++)DoOtherthing();}优点:程序简洁缺陷:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化解决,减少了效率。优点:循环的效率高缺陷:程序不简洁四、有关内存的思考题(每小题5分,共20分)voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,"helloworld");printf(str);}请问运营Test函数会有什么样的结果?答:程序崩溃。由于GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。strcpy(str,"helloworld");将使程序崩溃。char*GetMemory(void){charp[]="helloworld";returnp;}voidTest(void){char*str=NULL;str=GetMemory();printf(str);}请问运营Test函数会有什么样的结果?答:也许是乱码。由于GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。voidGetMemory2(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,"hello");printf(str);}请问运营Test函数会有什么样的结果?答:(1)可以输出hello(2)内存泄漏voidTest(void){char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL){strcpy(str,“world”);printf(str);}}请问运营Test函数会有什么样的结果?答:篡改动态内存区的内容,后果难以预料,非常危险。由于free(str);之后,str成为野指针,if(str!=NULL)语句不起作用。"28下列程序运营时会崩溃,请找犯错误并改正,并且说明因素。"//voidappend(intN);//指针没有初始化://NewNode->left=NULL;//NewNode->right=NULL;#include<stdio.h>#include<malloc.h>typedefstructTNode{TNode*left;TNode*right;intvalue;}TNode;TNode*root=NULL;voidappend(intN);intmain(){append(63);append(45);append(32);append(77);append(96);append(21);append(17);//Again,数字任意给出return0;}voidappend(intN){TNode*NewNode=(TNode*)malloc(sizeof(TNode));NewNode->value=N;NewNode->left=NULL;NewNode->right=NULL;if(root==NULL){root=NewNode;return;}else{TNode*temp;temp=root;while((N>=temp->value&&temp->left!=NULL)||(N<temp->value&&temp->right!=NULL)){while(N>=temp->value&&temp->left!=NULL)temp=temp->left;while(N<temp->value&&temp->right!=NULL)temp=temp->right;}if(N>=temp->value)temp->left=NewNode;elsetemp->right=NewNode;return;}}算法:1.什么是NPC,NP-Hard?2.起泡排序的时间复杂度是多少?说出至少一个比它更快的算法;排序的极限时间复杂度是多少?3.有一个链表,如何判断它是一个循环链表?假如链表是单向的呢?假如出现循环的点也许在任意位置呢?假如缓存空间是有限的,比如是一个常数呢?假如只能使用2个缓存呢?4.有一个文献,保存了若干个整数,如何以平均的概率随机得到其中的一个整数?假如整数的个数是未知的呢?假如整数是以字符串形式存放,如:(即如何得到随机的一个字符串)123<enter>-456<enter>…假如只允许便历文献一次呢?5.用两组数据,都在内存中,对它们排序分别需要1和2分钟;那么使用两个线程一起排序,大约需要多少时间?C/C++:C与C++的异同,优劣;1,全新的程序程序思维,C语言是面向过程的,而C++是面向对象的。

2,C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文献中;而C++对于大多数的函数都是集成的很紧密,特别是C语言中没有的C++中的API是对Window系统的大多数API有机的组合,是一个集体。但你也也许单独调用API。

3,特别是C++中的图形解决,它和语言的图形有很大的区别。C语言中的图形解决函数基本上是不能用在中C++中的。C语言标准中不涉及图形解决。

4,C和C++中都有结构的概念,但是在C语言中结构只有成员变量,而没成员方法,而在C++中结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,什么想访问它的都可以访问;而在VC++中它没有加限定符的为私有的。ﻫ

5,C语言可以写很多方面的程序,但是C++可以写得更多更好,C++可以写基于DOSr程序,写DLL,写控件,写系统。

6,C语言对程序的文献的组织是松散的,几乎是全要程序解决;而C++对文献的组织是以工程,各文献分类明确。ﻫ

7,C++中的IDE很智能,和VB同样,有的功能也许比VB还强。

ﻫ8,C++对可以自动生成你想要的程序结构使你可以省了很多时间。有很多可用的工具如加入MFC中的类的时候,加入变量的时候等等。ﻫ

9,C++中的附加工具也有很多,可以进行系统的分析,可以查看API;可以查看控件。ﻫﻫ10,调试功能强大,并且方法多样。2.C,C++,VC,BC,TC的区别;3.C++中try…catch关键字的用法与优点;4.枚举的用法,以及它与宏的区别;5.const的用法,以及声明const变量与宏的区别;const的用法有四种:区别:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有类型安全检查。并且字符替换也许会带来料想不到的边界效应。有些集成化工具可以对const常量进行调试,但不能对宏量进行调试。6.C++中引用与指针的区别;答:1引用事实上是所引用的对象或变量的别名,而指针是包含所指向对象或变量的地址的变量。2引用在定义时必须初始化,而指针在定义时不初始化。3不可以有指向NULL的引用,而可以有指向NULL的指针。4引用在初始化后不可以改变引用关系,而指针可以随时指向其他对象(非const指针)。7.C++中virtual与inline的含义分别是什么?答:在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。inline与函数的定义体放在一起,使该函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。虚函数的特点:假如希望派生类可以重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。内联函数的特点;使用内联函数的目的是为了提高函数的运营效率。内联函数体的代码不能过长,由于内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,由于执行循环语句要比调用函数的开销大。一个函数能否即是虚函数又是内联函数?8.以下关键字的含义与用法:extern,extern“C”,static,explicit,register,#undef,#ifndef9.什么是函数重载与覆盖?为什么C不支持函数重载?为什么C++能支持函数重载?10.VC中,编译工具条内的Debug与Release选项是什么含义?11.编写my_memcpy函数,实现与库函数memcpy类似的功能,不能使用任何库函数;void*mymemcpy(void*pvTo,constchar*pvFrom,size_tsize){assert((dest!=NULL)&&(src!=NULL));byte*psTo=(byte*)pvTo;byte*psFrom=(byte*)pvFrom;while(size-->0){*psTo++=*psFrom++;}returnpvTo;}12.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数;答:char*my_strcpy(char*strdest,constchar*strsrc){assert(strdest!=NULL)&&(strsrc!=NULL))char*address=strdest;while((*strdest++=*strsrc++)!=NULL)returnaddress;}13.编写gbk_strlen函数,计算具有汉字的字符串的长度,汉字作为一个字符解决;已知:汉字编码为双字节,其中首字节<0,尾字节在0~63以外;(假如一个字节是-128~127)14.函数assert的用法?答:断言assert是仅在debug版本起作用的宏,用于检查“不应当“发生的情况。程序员可以把assert当作一个在任何系统状态下都可以安全使用的无害测试手段。15.为什么在头文献的最前面都会看到这样的代码:#ifndef_STDIO_H_#define_STDIO_H_16.为什么数组名作为参数,会改变数组的内容,而其它类型如int却不会改变变量的值?答:当数组名作为参数时,传递的事实上是地址。而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对形参的改变并不影响实参的值。1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。2.写一个函数,将其中的\t都转换成4个空格。3.Windows程序的入口是哪里?写出Windows消息机制的流程。4.如何定义和实现一个类的成员函数为回调函数?5.C++里面是不是所有的动作都是main()引起的?假如不是,请举例。6.C++里面如何声明constvoidf(void)函数为C程序中的库函数?7.下列哪两个是等同的intb;Aconstint*a=&b;Bconst*inta=&b;Cconstint*consta=&b;Dintconst*consta=&b;8.内联函数在编译时是否做参数类型检查?voidg(base&b){b.play;}voidmain(){sons;g(s);return;}3、WinMainwhile((bRet=GetMessage(&msg,NULL,0,0))!=0){if(bRet==-1){//handletheerrorandpossiblyexit}else{TranslateMessage(&msg);DispatchMessage(&msg);}}MSRAInterviewWrittenExam(December2023,Time:2.5Hours)1写出下列算法的时间复杂度。(1)冒泡排序;(2)选择排序;(3)插入排序;(4)快速排序;(5)堆排序;(6)归并排序;2写出下列程序在X86上的运营结果。structmybitfields{unsignedshorta:4;unsignedshortb:5;unsignedshortc:7;}testvoidmain(void){inti;test.a=2;test.b=3;test.c=0;i=*((short*)&test);printf("%d\n",i);}3写出下列程序的运营结果。unsignedinti=3;cout<<i*-1;4写出下列程序所有也许的运营结果。inta;intb;intc;voidF1(){b=a*2;a=b;}voidF2(){c=a+1;a=c;}main(){a=5;//StartF1,F2inparallelF1();F2();printf("a=%d\n",a);}转贴请注明:志远工作室5考察了一个CharPrev()函数的作用。6对16Bitscolors的解决,规定:(1)Byte转换为RGB时,保存高5、6bits;(2)RGB转换为Byte时,第2、3位置零。7一个链表的操作,注意代码的健壮和安全性。规定:(1)增长一个元素;(2)获得头元素;(3)弹出头元素(获得值并删除)。8一个给定的数值由左边开始升位到右边第N位,如0010<<1==0100或者00010011<<4==00110000请用C或者C++或者其他X86上能运营的程序实现。附加题(只有在完毕以上题目后,才获准回答)InC++,whatdoes"explicit"mean?whatdoes"protected"mean?1.是不是一个父类写了一个virtual函数,假如子类覆盖它的函数不加virtual,也能实现多态?virtual修饰符会被隐形继承的。private也被集成,只是派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)#include<iostream>usingnamespacestd;voidmain(){chara[50];memset(a,0,sizeof(a));inti=0,j;chart;cin.getline(a,50,'\n');for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}cout<<a<<endl;}//第二种stringstr;cin>>str;str.replace;cout<<str;3.请简朴描述Windows内存管理的方法。内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~我先说个大约,希望可以抛砖引玉吧当程序运营时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才干被运营,由于现在的操作系统中有非常多的程序运营着,内存中不可以完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论