表示已有答案表示没有处理表示答案不确定C++笔试题1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键.3.main主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题)答案:可以,可以用_onexit注册一个函数,它会在main之后执行;如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。语法:#includestdlib.hintatexit(void(*function)(void));#includestdlib.h#includestdio.hvoidfn1(void),fn2(void),fn3(void),fn4(void);intmain(void){atexit(fn1);atexit(fn2);atexit(fn3);atexit(fn4);printf(Thisisexecutedfirst.\n);}voidfn1(){printf(next.\n);}voidfn2(){printf(executed);}voidfn3(){printf(is);}voidfn4(){printf(This);}结果:Thisisexecutedfirst.Thisisexecutednext.4.一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?在子类的空间里,有没有父类的这个函数,或者父类的私有变量?(华为笔试题)答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static除外)。5.给一个字符串、例如“ababc”要求返回“ab”.因为“ab”连续重复出现且最长。用C/C++语言写一函数完成该算法,给出复杂度6.对序列1、1、2、3、5、8、13。。。。是Fab..数列2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质给出k,返回第k小的Fab..质数7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。8.完成字符串拷贝可以使用sprintf、strcpy及memcpy函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?答案:这些函数的区别在于实现功能以及操作对象不同。1.strcpy函数操作的对象是字符串,完成从源字符串到目的字符串的拷贝功能。2.snprintf函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(字符串或基本数据类型)向字符串的转换功能。如果源对象是字符串,并且指定%s格式符,也可实现字符串拷贝功能。3.memcpy函数顾名思义就是内存拷贝,实现将一个内存块的内容复制到另一个内存块这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy的操作对象不局限于某一类数据类型,或者说可适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于memcpy函数等长拷贝的特点以及数据类型代表的物理意义,memcpy函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:strcpy无疑是最合适的选择:效率高且调用方便。snprintf要额外指定格式符并且进行格式转化,麻烦且效率不高。memcpy虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度+1),还会带来性能的下降。其实strcpy函数一般是在内部调用memcpy函数或者用汇编直接实现的,以达到高效的目的。因此,使用memcpy和strcpy拷贝字符串在性能上应该没有什么大的差别。对于非字符串类型的数据的复制来说,strcpy和snprintf一般就无能为力了,可是对memcpy却没有什么影响。但是,对于基本数据类型来说,尽管可以用memcpy进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下memcpy几乎不被使用。memcpy的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。9.变量的声明和定义有什么区别?10.请写出下面代码在32位平台上的运行结果,并说明sizeof的性质:#includestdio.h#includestdlib.hintmain(void){chara[30];char*b=(char*)malloc(20*sizeof(char));printf(%d\n,sizeof(a));printf(%d\n,sizeof(b));printf(%d\n,sizeof(a[3]));printf(%d\n,sizeof(b+3));printf(%d\n,sizeof(*(b+4)));return0;}12.请完成以下题目。注意,请勿直接调用ANSIC函数库中的函数实现。a)请编写一个C函数,该函数给出一个字节中被置1的位的个数,并请给出该题的至少一个不同解法。第一种unsignedintTestAsOne0(charlog){inti;unsignedintnum=0,val;for(i=0;i8;i++){val=logi;//移位val&=0x01;//与1相与if(val)num++;}returnnum;}第二种unsignedintTestAsOne1(charlog){inti;unsignedintnum=0,val;for(i=0;i8;i++){val=(~log)i;//反码?val&=0x00;//与0相与if(!val)num++;}returnnum;}b)请编写一个C函数,该函数将给定的一个字符串转换成整数。intInvert(char*str){intnum=0;while(*str!='\0'){intdigital=*str-48;num=num*10+digital;str=str+1;}returnnum;}c)请编写一个C函数,该函数将给定的一个整数转换成字符串。voidIntToCharChange(intnum,char*pval){charstrval[100];inti,j;intval0=0;intval1=0;val0=num;for(i=0;i100;i++){val1=val0%10;//取余val0=val0/10;//取整strval[i]=val1+48;//数字—字符if(val010){i++;strval[i]=val0+48;break;}}for(j=0;j=i;j++)//倒置{pval[j]=strval[i-j];}pval[j]='\0';}d)请编写一个C函数,该函数将一个字符串逆序。voidAntitoneValue(char*father,char*child){inti;charsource[100];intj=0;while(father[j])//放入source,[j]为长度{source[j]=father[j];j++;if(j99){return;}}source[j]='\0';for(i=0;ij;i++){child[i]=source[j-i-1];//反序}child[i]='\0';}e)请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。intsearch(char*cpSource,intn,charch)//起始地址,搜索长度,目标字符{inti;for(i=0;in&&*(cpSource+i)!=ch;++i);returni;}f)请编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。intChildString(char*p)//自己写{Char*q=p;intstringlen=0,i=0,j=1,len=0,maxlen=1;while(*q!=’\0’)//不能用strlen,求得长度stringlen{Stringlen++;q++;}while(iStringlen){if(*(p+i)==*(p+j)&&jStringlen){len++;//统计子串长度i++;j++;}else{if(lenmaxlen)//统计最大子串长度{maxlen=len+1;len=0;}else{len=0;}i++;j++;}}returnmaxlen;}给出演示上述函数功能的一个简单程序,并请编写对应的Makefile文件13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,图形有矩形(Rectangle),正方形(Square),圆形(Circle)等种类,应用需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式做为示意)。a)请用面向对象的方法对以上应用进行设计,编写可能需要的类b)请给出实现以上应用功能的示例性代码,从某处获取图形信息,并且进行计算和绘制c)如果你的Square继承自Rectangle,请给出理由,如果不是,请给出理由,并且请比较两种方式的优劣d)请问你所编写的类,在如下代码中会有何表现,请解释voidtest_rectangle_area(Rectangle&r){r.set_width(10);r.set_height(15);assert(r.area()==150);}14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点参考:将下一个节点的内容复制到本节点上,然后删除下一个节点;15.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度)16.编写一个Identify的分配、释放的函数,为1-10000之间的自然数。17.分别实现itoa和atoi.18.Considerthefollowingcode:#includestdio.h#includestring.hintmain(intargc,char*argv[]){inti=1;charbuf[4];strcpy(buf,AAAA);printf(%d\n,i);return0;}a)Whencompiledandexecutedonx86,whydoesthisprogramusuallynotoutputwhattheprogrammerintended?在x86上为什么不能得到预期结果b)NameseveralwaysinwhichthesecurityproblemthatcausesthisprogramnottooutputwhattheprogrammerintendedcanbepreventedWITHOUTchangingthecode.参考:第一个问题:32位情况:x86下,栈方向向上生长.在main的栈中,先分配i空间(4byte),然后分配4个字节的buf(地址在i的上面,比i小).strcpy越界,用0把buf开始的第4(0开始)个字节覆盖掉了.而x86是LSB排列顺序,所以真好覆盖了i的内个数字1.所以显示出数字0.16位情况