c++笔试题汇总更新400道.docx





《c++笔试题汇总更新400道.docx》由会员分享,可在线阅读,更多相关《c++笔试题汇总更新400道.docx(145页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+笔试面试!000题1 .什么是“引用”?申明和使用“引用”要注意哪些问题?答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作 效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后, 相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作 为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用 名是目标变量名的个别名,它本身不是种数据类型,因此引用本身不占存储 单元,系统也不给引用分配存储单元。不能建立数组的引用。2 .指针和引用的区别?答:引用是在C+中引入的。它们之间的区别有:(1)非空区别:指针可以为空,而引
2、用不能为空(2)可修改区别:如果指针不是常指针,那么就可以修改指向,而引用不能 (3)初始化区别:指针定义时可以不初始化,而引用在定义的时必须初始化3、为什么构造函数不能声明为虚函数?答:因为虚函数采用的是虚调用的方法,虚调用是指允许在只知道部分信息的情 况下的工作机制,特别允许我们调用个只知道接口而不知道其对象的准确类型 的函数。但是如果我们要调用构造函数创建对象时,必须要知道对象的准确类型, 因此构造函数不能为虚函数。4 . char strl= abc ; char str2| = abc” ; strl=str2 为 FALSE,因为 strl 和str2是位于堆栈上的,它们占用不同的
3、内存空间。Const char str3 = abc” ; const char str4 = abc” ; str3=str4为FALSE,同样它们是位于堆栈上的内存空 间,是不同的。Const char *str5= abc” , const char *str6= abc ;char *str7= abc,char *str8= abc ,str5=str6 str7=str8 为 TRUE,因为“ abc是位 于文字常量区的,系统会将几个“abc进行优化,使它们位于同块内存区,因 此指针的指向也就相同了。5 .以下函数能求出数组的长度吗?void fun(char str) int l
4、en = sizeof(str)/sizeof(str0);答:不能,数组作为参数传递给函数时,数组名被退化为指针,因此函数中的 sizeof(str)实际是在求一个指针的sizeof,答案为4,因此不能计算出数组的长度。6 .类的静态成员和非静态成员有何区别?答:类的静态成员每个类只有一个,静态成员为所有类的实例对象共享,静态成 员有静态成员变量和静态成员函数,静态成员变量使用前必须初始化,静态成员 变量可以被静态成员函数和非静态成员函数访问,而静态成员函数只能访问静态 成员变量,因为静态成员函数属于类,其没有this指针。非静态成员每个对象都 有一个。7 .static的有什么作用(包括在
5、类中)?答:(1)函数体内的静态变量,其值在函数的调用过程中保持不变。跟局部变量 的区别。(2)在函数体外定义的静态变量,限制了它的使用范围只在于该子模块,该 子模块内的函数都能访问它,但是子模块外不能访问,实际就类似于是个本地 的全局变量。与一般全局变量的区别。(3)类的静态成员函数。本质上来说,static就是声明了对象的生成期,限制了对象的作用域。或(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的 内存只能被分配一次,因此其值在下次函数调用时仍维持上次的值。(2)在模块内的static全局变量可以被模块内的所有函数访问,但不能被模块 外其他函数访问。(3)
6、在模块内的static函数只可被这模块内的其他函数调用,这个函数的使 用范围被限制在声明它的模块。(4)在类中的static成员变量属于整个类所有,对类的所有对象只有一份拷贝。(5)在类中的static成员函数属于整个类所有,这个函数不接受this指针,因 而只能访问类的static成员变量。8.写程序,将一个字符串倒序?答:直接在main函数中实现的void main()char * source = hello;char *des;int len = strlen(source);des = (char *)malloc(len+l); 申请空间必须是len+1,加1是为了放结束符if (
7、!des) exit(l); )char *s = &sourcelen-l;char *d = des;while (len!=0) *d+ = *s; *d 二、; 必须要coutsourceendl;coutdesendl;9 .在C+程序中调用C编译后的函数,为什么要加extern C的声明?答:因为C+支持函数重载,而C不支持函数重载。函数被C+编译后在库中的 名字与C语言的不同。假设某个函数的原型为:void foo(int x, int y):该函数被C 编译器编译后在库中的名字为_foo,而C+编译器则产生像foo_int_int之类的名 字。C+提供了 C连接交换指定符号ex
8、tern C来解决名字匹配问题。10 .C+中哪些函数不能被声明为虚函数?答:普通函数(非成员函数),构造函数,内联成员函数、静态成员函数、友元函 数。(1)虚函数用于基类和派生类,普通函数所以不能(2)构造函数不能是因为虚函数采用的是虚调用的方法,允许在只知道部分信息 的情况的工作机制,特别允许调用只知道接口而不知道对象的准确类型的方法, 但是调用构造函数即使要创建一个对象,那势必要知道对象的准确类型。(3)内联成员函数的实质是在调用的地方直接将代码扩展开(4)继承时,静态成员函数是不能被继承的,它只属于个类,因为也不存在动 态联编等(5)友元函数不是类的成员函数,因此也不能被继承10.1
9、nclude D include filename.h”的区别?答:O是从标准库路径搜索,是从用户当前工作目录开始,找不到,在到标 准库开始12.编写strlen函数,编写strcpy函数答:int Strlen(const char *str)int len = 0;assert(str != NULL);while (*str+ 占。) len+; return len;非空判断是必须进行的操作,可以使用断言的方式assert(str) != NULL会继续char *StrCpy(char *strDes, const char *strSrc)assert(strDes != NULL
10、) & (strSrc != NULL);char *address = strDes;while (*strDes+ = *strSrc+) !=。);return address;首先必须判断两个指针是否为空,由于复制后的指针需要返回,因此需要一个指针来记录地址的初始值,最 后将复制的结果返回是为了进行链式操作。13Heap和Stack的区别?答:Heap是堆,Stack是栈。栈的空间由操作系统自动分配和回收,而堆上的空间由程序员申请和释 放。栈的空间大小较小,而堆的空间较大。栈的地址空间往低地址方向生长,而堆向高地址方向生长。栈的存取效率更高。程序在编译期间对变量和函数的内存分配都在栈上
11、,且程序运行过程中对函数调用中参数的内存分配也是在栈上。14.输出的结果是多少,并分析过程?unsigned short A = 10;printf( “un”,A);char ch = 128;printf( %dn , ch);答:A=4294967285,首先将A转化为int类型,即对应的二进制数值为:00000000 00000000 00000000 00001010, A=11111111 11111111 11111111 11110101,其实这 种情况最高位是1,认为是负数,但是在输出中指定以无符号数输出,于是结果为 4294967285=4294967295 (四字节表示的
12、最大数)-10.ch = 128对应的二进制为:10000000,在输出中以整数形式输出,由于最高位是1, 于是就是负数,10000000是该负数的补码,根据求补码的反步骤计算,先1,得到 01111111,在取反得10000000=128,由于本身是负数,即为128.15、sizeof和strlen之间的区别?答:(1) sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int 类型,该类型保证能容纳实现所建立的金大对象的字节大小。(2) sizeof是运算符,strlen是函数(3) sizeof可以用类型做参数,strlen只能用char 做参数
13、,且必须是 以、结尾的。(4)数组做sizeof的参数不退化,传递给strlen就退化为指针。(5)大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量 的长度。(6)strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度, 而不是类型占用内存的大小。(7) sizeof后如果是类型必须加括号,如果是变量名可以不加括号。(8)当使用了一个结构类型或变量时,sizeof返回实际的大小。(9)数组作为参数传递给函数时传的是指针而不是数组,传递的是数组 的首地址。(10)计算结构变量的大小就必须讨论数组对齐问题。(11) sizeof操作符不能用于函数类型,不完全类型或位字
14、段。16 .内联函数和宏的差别?答:内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用, 在编译的时候内联函数可以直接被镶嵌到目标代码中,而宏只是-个简单的替换。 内联函数要做参数类型检査,这是与宏相比的优势。Inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到 那里去。对于短小的代码来说,inline可以带来一定效率的提升,而且和C时代的 宏函数相比,inline更安全可靠。可是这是以增加空间消耗为代价的。Inline 一般只适用于:个函数被不断地重复调用;函数只有简单的儿行,且 函数内不能含有for while switch语句。17 .请找出下面代码中
15、的所以错误说明:以下代码是把个字符串倒序,如“ abed”倒序后变为“deba”#include string, h”main () char*src=w hello, worldw ;char* dest=NULL;int len=strlen(sre);dest=(char*)malloc(len);char* d=dest;char* s=srclen;while(len - !=0)d+=s -;printf( %sw , dest);return 0;,答:方法1:int main() char* sre = hello, worldM ;int len = strlen(src);
16、char* dest = (char*)malloc (len+1);要为、分配个空间char* d = dest;char* s = &src lenT;指向最后-个字符while( len - != 0 )*d+=*s -;*d = ;尾部要加、printf( K%snM , dest);free(dest);使用完,应当释放空间,以免造成内存汇泄露return 0;18 .用两个栈实现个队列的功能?要求给出算法和思路!设2个栈为A,B,开始均为空.入队:将新元素push入栈A;出队:(1)判断栈B是否为空;(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈
17、顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是 0(1),比上面的几种方法要好19 .下面的程序中x是多少?enum stringxl, x2, x3=10, x4, x5, x;x= 0X801005, 0x801 Of4;20多态的作用?主要是两个:1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码 重用;2.接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例 的某属性时的正确调用。21. New delete 与 malloc free 的联系与区别?都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节 数并且不能初始化对象
18、,new会自动调用对象的构造函数。delete会调用对象的 destructor,而 free 不会调用对象的 destructor.22. #def ine DOUBLE (x) x+x , i = 5*D0UBLE(5); i 是多少?答案:i为30。23. 局部变量能否和全局变量重名答:能,局部会屏蔽全局。要用全局变量,需要使用:局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部 变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多 个同名的局部变量,比如在两个循环体内都定义个同名的局部变量,而那个局部变 量的作用域就在那个循环体内。2、如何引用个已经
19、定义过的全局变量答: extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来 引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间 会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间 不会报错,而在连接期间报错24全局变量可不可以定义在可被多个.C文件包含的头文件中为什么答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中 对此变量赋初值,此时连接不会出错25 .设有以下说明和定义:typedef union long i; int k5;
20、 char c; DATE; struct data int cat; DATE cow; double dog; too;DATE max;则语句 printf(d”,sizeof(struct date)+sizeof(max);的执行结果是: 52答:DATE是一个union,变量公用空间.里面最大的变量类型是int5,占用20个字节,所以它 的大小是20 data是个struct,每个变量分开占用空间.依次为int4 + DATE20 + doubles = 32.所以结果是20 + 32 = 52.当然.在某些!6位编辑器下,int可能是2字节,那么结果 是 int2 + DATE
21、10 + doubles = 226 .unsigned short hash(unsigned short key) return (key)%256 请问 hash(16),hash(256)的值分别是:A.1.16;B.8.32;C.4.16;D.1.3227请问下面程序有什么错误?int a602501000,i,j,k;for(k=0;k=l 000;k+)for(j=0;j250;j+)for(i=0;i60;i+)ajk=O;把循环语句内外换一下28下面程序的打印结果是什么?请分析#define Max_CB 500void LmiQueryCSmd(Struct MSgCB *
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 笔试 汇总 更新 400

限制150内