c和c++面试题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.c和c++中struct有什么区别答:c没有Protection行为,不可以定义函数,但可以有函数指针c++有Protection行为,默认是public;可以定义函数。2.c++中的struct和class有什么区别答:从语法上讲,class和struct做类型定义时只有两点区别:1默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理2成员的默认访问权限。Class的成员默认是private权限,struct默认是public权限。除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。3.如何判断一段程序是由c编译程序还是由c++编译程序编译的答:有一个宏可以用来判断#ifdef__cpluspluscout“c++”;#elsecout“c”;#endif4.c和c++有什么不同答:从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是,c++编写面向对象的程序比c容易。从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式,c++适合更上层的,复杂的;linux核心大部分是c写的,因为它是系统软件,效率要求极高。从名称上也可以看出,c++比c多了+,说明c++是c的超集,那为什么不叫c+而叫c++呢,是因为c++比c来说扩充的东西太多了,所以就在c后面放上两个+,于是就成了c++c语言是结构化编程语言,c++是面向对象编程语言c++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。5.“引用”与指针的区别是什么?答:指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差,而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。6.classA{virtualvoidfunc1();voidfunc2();}classB:classA{voidfunc1(){cout“fun1inclassb”endl;}virtualvoidfunc2(){cout“fun2inclassB”endl;}}A中的func1和B中的func2都是虚函数7.intid[sizeof(unsignedlong)];这个对吗?为什么?答:正确;这个sizeof是编译时运算符,编译时就确定了,可以看成和机器有关的常量。8.某文件中定义的静态全局变量(或称静态外部变量)其作用域是()?答:本文件。静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。9.c++函数中值的传递方式有哪几种?答:c++函数的三种传递方式为:值传递、指针传递和引用传递。10.对于一个频繁使用的短小函数,在c语言中应用什么实现,在c++中应用什么实现答:c用宏定义,c++用inline11.引用与指针有什么区别答:1引用必须被初始化,指针不必2引用初始化以后不能被改变(c++11可以改变),指针可以改变所指的对象3不存在指向空值的引用,但是存在指向空值的指针。12.c++中virtual与inline的含义分别是什么?答:在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。Inline与函数的定义体放在一起,使该函数称为内联。Inline是一种用于实现的关键字,而不是用于声明的关键字。虚函数的特点,如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。内联函数的特点,使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代介的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。13.VC中,编译工具条内的Debug与Release选项是什么含义?答:Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Debug带有大量的调试代码,运行时需要相应的运行库,发布模式程序紧凑不含有调试代码和信息,直接可以运行(如果不需要运行库)14.函数assert的用法?答:断言assert是仅在debug版本起作用的宏,用于检查“不应该”发生的情况。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。15.const与#define的比较,const有什么优点?答:1const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。2有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。16.请你谈谈引用和指针的区别1引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)2不能有NULL引用,左值引用必须与合法的存储单元关联(指针则可以是NULL)内存,右值引用引用寄存器。3一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。17.有了malloc/free为什么还要new/delete?答:malloc与free是c++/c语言的标准库函数,new/delete是c++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此c++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。18.如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。你是怎么处理内存耗尽的?答:1判断指针是否为NULL,如果是则马上用return语句终止本函数。2判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行3为new和malloc设置异常处理函数。例如VisualC++可以用_set_new_hander函数为new设置用户自定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。19.C++是不是类型安全的?答:不是。两个不同类型的指针之间可以强制转换(用reinterpretcast)。20.const符号常量1constchar*p2charconst*p3char*constp说明上面三种描述的区别:1)p是一个指向constchar的指针,p是可以改变指向的,但是p指向的值是不能改变的2)p指向的恰好是一个指向const的char的普通指针3)p是一个指针,这个指针是指向char的const指针1和2的定义是一样的。21.用c++写个程序,如何判断一个操作系统是16位还是32位的?答:定义一个指针p,打印出sizeof(p),如果结果是4,则表示该操作系统是32位,打印结果是2,表示是16位。22.用c++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数。答:inta=~0;if(a65536){cout“32Bit”endl;}else{cout“16Bit”endl;}如果是判断32位和64位,需要用到sizeof()。23.void*(*(*fp1)(int))[10];float(*(*fp2)(int,int,int))(int);int(*(*fp3)())[10]();分别表示什么意思?1void*(*(*fp1)(int))[10];fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每一个元素是一个void*型指针。2float(*(*fp2)(int,int,int))(int);fp2是一个指针,指向一个函数,这个函数的参数为3个int型,函数的返回值是一个指针,这个指针指向一个函数,这个函数的参数为int型,函数的返回值是float型。3int(*(*fp3)())[10]();fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是int型。24.多态类中的虚函数表是Compilie-Time,还是Run-Time时建立的?虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组,而对象的隐藏成员—虚拟函数表指针是在运行期—也就是构造函数被调用时进行初始化的,这是实现多态的关键。25.错误的转义字符是:A.’\091’B.’\\’C.’\0’D.’\’‘答:A,因为0开头的是二进制26.若数组名作实参而指针变量作形参,函数调用实参传给形参的是答:数组第一个元素的地址27.内存的分配方式有几种?答:1从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量2在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。3从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。28.floata,b,c,问等式(a+b)+c==(b+a)+c和(a+b)+c==(a+c)+b能否成立?答:两者都不行。在比较float或double时,不能简单地比较。由于计算误差,相等的概率很低。应判断两数之差是否落在区间(-e,e)内。这个e应比浮点数的精度大一个数量级。29.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?答:生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;内存中分配在全局数据区。使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面。30.Heap与stack的差别答:Heap是堆,stack是栈。Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。31.InC++,whatdoes“explicit”mean?Whatdoes“protected”mean?答:c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,在某些情况下,我们要求类的使用者必须显示调用类的构造函数时就需要使用explicit,反之默认类型转换可能会造成无法预期的问题。Protected控制的是一个函数对一个类的成员(包括成员变量及成员方法)的访问权限。Protected成员只有该类的成员函数及其派生类的成员函数可以访问。32.重复多次fclose一个打开过一次的FILE*

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功