C++基础面试题.docx

上传人:李司机 文档编号:7133654 上传时间:2024-06-15 格式:DOCX 页数:19 大小:31.60KB
返回 下载 相关 举报
C++基础面试题.docx_第1页
第1页 / 共19页
C++基础面试题.docx_第2页
第2页 / 共19页
C++基础面试题.docx_第3页
第3页 / 共19页
C++基础面试题.docx_第4页
第4页 / 共19页
C++基础面试题.docx_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《C++基础面试题.docx》由会员分享,可在线阅读,更多相关《C++基础面试题.docx(19页珍藏版)》请在三一办公上搜索。

1、1.const符号常域:、constchar*p(2) 、charconst*p(3) 、char*constp如果COnSt位于星号的左恻,则const就是用来修饰指针所指向的变量:,即指针指向为常量.如果ConSt位于星号的右恻,const就是修饰指针本身,即指针本身是常ffi2 .析构函数和虚函数的用法和作用?析构函数的作用是当对象生命期结束时释放对象所占用的资源。析构函数用法:析构函数是特殊的类成员函数它的名字和类名相同,没有返回值,没有参数不能随意调用也没仃垂我。只是在类对象生命期结束时有系统自动调川.虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚

2、函数,作用为使程序支持动态联遍。3 .维和栈的区别栈(StaCk):由编译胧自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似J微据结构中的栈。堆:般由程序员分配释放,若不释放,程序结束时可能由OS回收,注意它与数据结构中的堆是两回事,分配方式类似.4 .头文件的作用是什么?1 .通过头文件来调用阵功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取出相应的代科。2 .头文件能加强类型安全检杳。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译

3、器就会指出错误,这一筒雎的规则能大大减轻程序员调试、改错的负担。5 .内存的分配方式有几种?1 .从静态存储区域分配。内存:在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。如全局变量。2 .在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在校上创建,函数执行结束时这些存储单元自动被糅放。校内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限.3 .从堆上分配,亦称动态内存分配“程序在运行的时候用InalIoC或new申请任意多少的内存,程序员自己负责在何时用free或delele择放内存。动态内存的生存期由我们决定,使用非常灵活。6. BOO1.、floa

4、t,指针变量与零值比较的if语句”。Boo1.:If(flag)或if(!flag)FloaticonstfloatEPSINON=0.00001;If(x=.EPS1NW)M(x=或7此类形式。指针*p:if(P=NU1.1.)if(p!=NU1.D7. 以下为WindowsNT下的32位C+程序,请计算sizeof的值Charstr=Hello”;Char*p=str;Intn=10请计算:SizeofCstr)=6Sizeof(p)=4Sizeof(n)=2VoidFunc(charstr100)请计算:SiZeof(Str)=4)Void*p=ulloc(100)请计克:SiZeOf(

5、P)=48. #includefilename.h和#includefilename,h”有什么区别对于*includc,编译器从标准库路径开始搜索filename,对于#includefilename,h,编译器从用户的工作路径中开始搜索filename,h9. ConSt有什么用途1 .可以定义ConSt常向:2 .ConSt可以修饰函数的参数、返回值,其至函数的定义体被COnSt修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。10 .在C+程序中调用被C编译器编洋后的函数,为什么要加externC”?C+语言支持函数重载,C语言不支持函数重载。函数被C+编译后在库中的名

6、字与C语言的不同。假设某个函数的原型为:voidfee(intx,inty);该函数被C编译罂编译后在库中的名字为一foo,而C+编译器则会产生像_foo_int_int之类的名字.C+提供了C连接交换指定符号extern“C”来解决名字匹配的问题。11 .内存思考题VoidGetMemory(char*p)P=(char*)malIoc(100);VoidTest(void)Char*str=NU1.1.;GetMemory(Slr);Strcpy(str,helloworldw):Printf(str):函数内的变员是独立于main的,对其改变不会影响main的变员请问运行Test函数会仃

7、什么样的结果?程序会崩溃,因为GeIMemOy并不能传递动态内存:,TeSl函数中的str一直是NU1.1.oStrycpyCstr,helloWOrId);将使程序崩渍。Char*GetMemory(void)Charp=helloworld;Returnp;)VoidTest(void)Char*str=NU1.1.:Str=GetMcmoryO:Printf(str):)请问Test函数会有什么样的结果?可以是乱码.因为GetMemOry返回的是指向“栈内存”的指针,该指针的地址不是NU1.1.,但其原现的内容已经被清除,新内容不知。VoidGetAICmOry2(char*p,intn

8、um)*P=(char*)maHoc(num):)VoidTest(void)Char*slr=NU1.1.;GetMemory(&str,100);Strcpy(str1hello);Printf(str):请问运行TeSl函数会有什么样的结果?1 .能够输出hello2 .内存泄露VoidTest(void)Char*str=(char*)malIoc(100):Strcpy(str,hello):Free(str):If(str!=NU1.1.)Strcpy(str,world);Printf(str);请问运行Test函数会有什么样的结果?墓改动态内存区的内容,后果难以预料,非常危险。

9、因为free(str);之后,Str成为野指针,if(str!=NU1.1.)语句不起作用.1 .头文件的作用是什么?1 .通过头文件来调用库功能。在很多场合,源代码不便(不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。2 .头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这简单的规则能减轻程序员调试、改错的负担。2 .C+里面晃是不所有的动作都是main。引起的?如果不是,请举例在运行C+程序时,通常从main()函数开始执行

10、。因此如果没有main。,程序将不完整,编译器将指出未定义main()函数。例外情况:如,在IrindOW8编程中,可以编写一个动态连接库(D1.1.)模块,这是其他Endg8程序可以使用的代码.由于D1.1.模块不是独立的程序,因此不需要main。用于专用环境的程序一一如机器人中的控制器芯片一一可能不需要IIiain0,但常规的独立程序都需要三ain.3 .引用与指针的区别:1 .引用总是指向某个对象,定义时没有初始化是错误的:2 .给引用赋值是修改引用所关联的对象的值,所关联的对象不变。4 .变量的声明和定义有什么区别从编译原理上来说,声明是仅仅告诉编译潺,有个某类型的变量会被使用,但是编

11、译器并不会为它分配任何内存。而定义就是分配了内存。5 .Sizeof和strle11区别1、SiZeof操作符的结果类型是size.t,它在头文件中IyPedef为unsignedint类型。该类型保证能容纳实现所建立的最大对象的字节大2、SiZeof是运算符,StrICn是函数3、SizeofnJ以用类型做参数,StrIen只能用Char*做参数,且必须是以换行符0结尾的。4、StrIen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小.5、数组做SiZCof的参数不退化,传递给Strlen就退化为指针:6 .C中InaIlOC与new的区别1. new是C+中

12、的操作符,InaUOC是C中的个函数;2. new不上是分置内存,而且会调用类的构造函数,同理delete会调用类析构函数,而malIoc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数.3. 内存泄露对丁malloc或者new都可以检查出来的,区别在丁new可以指明那个文件的那一行,而malIoc没有这些信息。4. NeW和malloc效率比较NeW有三个字母,malIoc有六个字母NeW可以认为是malloc加构造函数的执行。NeW出来的指针是直接带类型信息.而malIoc返回的都是void指针。7 .关键字static在C和C+中的区别1 .在C语言中,主要体现在

13、睁态全局变量、静态局部变量和静态函数,2 .在CT中,主要体现在静态数据成员和静态成员函数。8 .简述#defineSendif和矩fndef的作用Jtdefine指示接受一个名字并定义该名字为预处理器变量:#inde检测指定的预处理变量是否定义;Jtendif预处理未定义9 .实现双向链表删除个节点P,在节点P后插入个节点,写出这两个函数;答:双向链表删除一个节点PTCmPlateclasstypevoidlist:delnode(intp)intk=1:listnode*ptr,*t;ptr=first;Whi1c(ptr-next!=NU1.1.k!=p)ptr=ptr-nexl:k+;

14、)t=ptr-next;cout你已经将数据项“data删除next=pt-next-next;length;delleI;在节点P后插入个节点:TemPIateclasstypebool1ist:insert(typet,intp)1.iSlnode*ptr;Ptr=first:intk=1;while(ptr!=NU1.1.&knext:k+;)If(ptr=NU1.1.&k=p)returnfalse;else1.istnode*tp;tp=new1istnodc;tp-data=t;tp-nexl=pti-nexl;ptr-next=tp;length+;returntrue:)10.

15、 sizeof的使用场合size”操作符一个主要用途是存储分配和I/O系统那样的例程进行通信。可以查看某种类型的对象在内存中所占单位字节:在动态分配一对象时,可以让系统指导要分配多少内存;便于一些类型的扩充。I1.以下代码有什么问避C+structTestTest(int);TeslO():voidfun()():voidmain(void)Testa(l);a. funO;Testb():b. fun():Testb();定义了一个函数b不是一个类对象。1 .以下代码有什么问题?Cout(true?l:wendl;1:1不是同一类型:前后必须是同一类至or能隐式转换的类型2 .以卜.三条输出

16、语句分别输出什么?charSIJrl口=abc;charstr2=abc;constcharst,3=abc:constcharstr4=abc;constchar*str5=abc;constchar*Stre=abc;coulboolalpha(str=slr2)endl;coutboollalpha(str3=str4)endl:coutboollalpha(str5=str6)tcmp:unsignedintconstsize2=temp:charstr2size2;slr2定义出错,size2非编译器期间常量,而数组定义要求长度必须编译期常量。5 .编写SlrCPy函数已知SlrCP

17、y函数的原型是char*sIrcpy(char*strDest,constchar*strSrc);其中strDest是目的字符串,StrSrc是源字符中.char*strcpy(char*strDest1constchar*strSrc)assert(strDest!=NU1.1.)&(strSrc!=NU1.1.);char*address=strDest;while(*strDesl+=*strSrc+)!=0,)NU1.1.:returnaddress:)strycpy能把strSrc的内容复制到strDest,为什么还要Char*类型的返回值?为了实现链式表达式。如:inilengt

18、h=Strlen(strcpy(strDest,nhelloworld):6 .写出下面这段代码的输出includeIntmain(void)inia,b,c,;a=10;b-a+:c=+a;d=10a*+:printf(b,c,k-d,%d,D”,a,b,c);return0:10,12,120;7 .编写类String的构造函数、析构函数和赋值函数classSlringpublic:String(Constchar*str=NU1.1.);普通构造函数String(constStringother):/抒由构造函数String(void);析构函数String&operate=(const

19、String&othcr);赋值函数private:char*m_data;用于保存字符串;SIring的析构函数String:String(void)deletemdata;由于mdata是内部数据类型,也可以写成deletemdata;)SIring的普通构造函数String:String(constchar*str)If(str=NU1.1.)m_data=newcharl;indata=*0,;)else(intlength=strlen(str):mdata=newcharlength+Ij:strcpy(mdata,str);拷贝构造函数String:String(constStr

20、ingother)intlength=Slrlen(other,mdata);m_data=newcharlength+1:Strcpy(mdata,other,data);)赋值函数String&String:operate=(constString&other)I.检杳自赋值If(this=fiother)return*this;/2.释放原有的内存资源Dcletcm_data:3,分配新的内存资源,并复制内容intlength-slrlen(other.m_data):mdata=newcharlenglh+l;Strcpy(11data,other,mdata):return*this

21、;8,全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?可以,在不同的C文件中以SmiC形式来声明同名全局变更。可以在不同的C文件夹中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.9 .对于个频繁使用的短小函数,在C语言中应用什么实现,在C+中应用什么实现?C用宏定义,C+用inline10 .指出下面代码的输出,并解择为什么inta5=(1,2,3,4,5;int*ptr=(int*)(&a+l):printf(*4d,%dw,*(a+l),*(ptr-i):)输出:2,5*(a+l)就是al,Mptr-D就是a4,执行结果是2,5;&a-l不

22、是首地址7,系统公认为加一个a数组的偏移,是偏移/一个数组的大小(本例是5个ini)int*ptr=(int*)(&a+D;则Ptr实际是&(a5),也就是a+5原因如下:&a是数组指针,其类型为是t(*)5:而指针加1要根据指针类型加一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int)所以Ptr实际是a5但是Ptr与(&a+D类型是不一样的(这点很重要)所以ptr-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a(的地址,&a是对象(数组)首地址,a+1是数组卜.一元素的地址,即al,

23、&a+l是下个对象的地址,即a51 .以卜代码中的两个SiZeof用法有问题吗?size”如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。注意:数组名作为函数参数时,退化为指针。数组名作为SiZeOfO参数时,数组名不退化,因为SiZeCf不是函数。2 .请问以下代码有什么问题int11ain()chara;char*str=&a;strcpy(str1,hello):printf(str):return0:)没有为Str分配内存空间,将会发生异常问题出在将个字符串更制进个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃Strcpy的在库函

24、数string,h中,程序的主要程序在丁越办进行内存读写导致程序崩溃。2.constchar*s=AAA:Printf(4%sm,s):S0=B;Printf(u%s,s);“AAA”是字符串常量,S是指针,指向这个字符串常量,所以声明$的时候就有问题。Constchar*s=MA”,然后又因为是常量,所以对S0的赋值操作是不合法的。CharSZStr10:;Strcpy(szslr,w0123456789,):产生什么结果?为什么?正常输出,长度不一样,会造成非法的OS,覆盖别的内容4 .交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;两种解法,一种是用算术算法

25、,一种是用,(异或)a=a+b:b=a-b:a=a-b;ora=ab;只能对ini,charb-ab:a=ab:ora=b=a;5 .inta=256;chard=a;pint(,t%dn,d+l):1Char类型的变显赋值范闱是0255当把256赋值给a时,超出了a的有效取值范围。此时a的实际值为0.6 .将“引用“作为函数返回值类型的格式、好处和需要遵守的规则格式:类型标识符&函数名(形参列表及类型说明函数体)格式:在内存中不产生被返回值的副本:(注意:正是因为这点原因,所以返回个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效.)注意事项:1 .不能返回同部变

26、量的引用。主要原因是局部变量会在函数返回时被销毁,因此被返回的引用就成为了“无所指的”引用,程序会进入未知状态。2 .不能返I可函数内部new分配的内存的引用.虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬的局面。如,被函数返回的引用只是作为一个临时变量出现,而没仃被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放。3 .可以返回类成员的引用,但最好是consl。主要原因是当对象的属性是与某种业务规则相关联时,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在个业务规则当中。如果其它时象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。7 .多态的作用:1 .隐藏实现细节,使得代码能够模块化:扩展代码模块,实现代码重用;2 .接口全用:为了类在继承和派生的时候,保证使用家庭中任一类的实例的某一属性时的正确调用。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号