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