大学C++复习题.docx
- 文档编号:3321131
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:24
- 大小:36.55KB
大学C++复习题.docx
《大学C++复习题.docx》由会员分享,可在线阅读,更多相关《大学C++复习题.docx(24页珍藏版)》请在冰豆网上搜索。
大学C++复习题
C++复习题
一、简答题
1.在c++中,内联函数中不能使用什么语句?
答:
不允许使用循环语句和分支语句
2.在c++中,封装可以由那几个关键字提供控制方式?
分别作用是什么?
答:
在类定义体里,使用了private、protected、public三个关键字是用来说明数据成员和函数成员的访问权限。
public说明公有成员,该类成员都可以通过对象被访问的。
private说明私有成员,该类成员只能被自己的成员函数或友元访问;
protected说明保护型的成员,可以被自己的成员函数或友元访问,也可以被派生类的函数成员访问;
3.由于二义性原因,一个类如何防止从一个类中重复继承?
答:
①通过使用作用运算符“:
:
”明确指出访问的是哪个基类中的成员;②在类中定义同名成员;③虚基类(virtual继承方式基类名)
4.在c++中,如果在多条继承路径有一个公共的基类,如果想使这个公共的基类只产生一个拷贝,则如何处理这个基类?
用什么关键字?
答:
将这个公共基类说明为虚基类,用virtual关键字
5.简单成员函数是指声明中不含有什么关键字的函数?
(关注存储类型)
答:
简单成员函数是指存储类型为auto型
。
static,extern,register
6.静态成员的特点?
答:
静态成员的特点是:
不管这个类创建多少个对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象所共享。
7.当访问私有静态数据成员时,可通过什么来访问?
答:
在类外,私有静态数据成员不能直接访问,必须通过公有的成员函数访问。
8.有关继承,静态成员是否可以被继承?
可以。
友元是否可以被继承?
不可以构造函数是否可以被继承?
不可以
9.c++不允许重载什么运算符?
答:
成员访问运算符.;作用域运算符∷
;条件运算符?
:
;成员指针运算符*;长度运算符sizeof()
10.那些运算符只能用类运算符来重载?
答:
=()[]*这四个只能用类重载
11.c++提供格式宽度控制方式有哪几种?
关键字是?
答1.int width(int val) int width( ) intios:
:
width(intn)2.setw(intn)
12.十进制数0.1的二进制表示是什么?
答:
(0.1)10=(0.000110011...)2,它是无限循环小数。
也就是说,十进制数0.1无法精确用二进制表示!
13.简述程序设计的步骤。
答:
程序设计一般遵循以下步骤:
明确问题;系统设计;用某种语言进行编程;测试与调试;运行与维护
14.简述编译与解释的区别。
答:
编译是指把高级语言程序首先翻译成功能上等价的机器语言程序或汇编语言程序,然后执行目标代码程序,在目标代码程序的执行中不再需要源程序。
解释则是指对源程序中的语句进行逐条翻译并执行,翻译完了程序也就执行完了,这种翻译方式不产生目标程序。
一般来说,编译执行比解释执行效率要高
15.简述C++程序的编译执行过程
答:
编译过程主要分为4个阶段:
编译预处理;编译、优化阶段;汇编过程;链接程序(?
)
16.下面哪一些是合法的C++字面常量,它们的类型是什么?
-5.23,1e+50,-25,105,20
.20,e5,1e-5,-0.0e5,'\n'
-000,'A','5','3.14',false
red,'\r','\f'"TodayisMonday.","\""
答:
字面常量是指在程序中直接写出常量值的常量。
-5.23,1e+50,-25,20,.20,1e-5,-0.0e5,'\n',-000,'A','5','\r','\f',"TodayisMonday.","\""都是字面常量。
其中:
整数类型常量:
-25,20,-000
实数类型常量:
-5.23,1e+50,.20,1e-5,-0.0e5
字符常量:
'\n','A','5','\r','\f'
字符串常量:
"TodayisMonday.","\""
17.什么是符号常量?
符号常量的优点是什么?
答:
符号常量是指有名字的常量,在程序中通过常量的名字来使用这些常量。
程序中使用符号常量有以下优点:
(1)增加程序易读性;
(2)提高程序对常量使用的一致性;(3)增强程序的易维护性
18.如何理解变量?
变量定义和声明的作用是什么
答:
值可以改变的量叫变量,可变的数据.使用变量前,C++要对变量做声明
19.指针类型主要用于什么场合?
引用类型与指针类型相比,其优势在哪里?
答:
指针类型主要用于参数传递和对动态变量的访问。
在C++中,指针类型还用于访问数组元素,以提高访问效率。
引用类型与指针类型都可以实现通过一个变量访问另一个变量,但访问的语法形式不同:
引用是采用直接访问形式,指针则采用间接访问形式。
在作为函数参数类型时,引用类型参数的实参是一个变量,而指针类型参数的实参是一个变量的地址。
除了在定义时指定的被引用变量外,引用类型变量不能再引用其他变量;而指针变量定义后可以指向其他同类型的变量。
因此,引用类型比指针类型要安全。
20.constint*p1和int*constp2的区别是什么?
答:
constint*p1是指向常量的指针,指针指向一个常量,无需初始化,指针本身可以改变,但是指针指向的值不能改变。
int*constp2是指向常量的引用,使用时必须初始化,而且初始化后,引用值不可以改变,引用的常量也不能改变。
21.表达式中的类型转换规则是什么?
下面的表达式计算时如何进行操作数类型转换?
(1)3/5*12.3
(2)'a'+10*5.2
(3)12U+3.0F*24L
表达式中类型转换规则是:
基于单个操作符依次进行转换。
1)3与5同类型,不转换,结果为0,转换成double型后与12.3做乘法。
2)10转换成double型与5.2做乘法,’a’转换成double型后与前者结果做加法。
22.将下列公式表示成C++的表达式:
(1)
(可利用C++标准库中的求平方根的函数:
sqrt(x))
(-1*b+sqrt(b*b-4*a*c))/(2*a)
(2)
:
sqrt(s*(s-a)*(s-b)*(s-c))
(3)
((a*b)/(c*d))*(3/(1+(b/(2.5+c))))+(4*pi*r*r*r/3)
23.派生类构造函数执行的次序是怎样的?
答:
派生类构造函数执行的一般次序为:
调用基类构造函数;调用成员对象的构造函数;派生类的构造函数体中的内容。
24.如果在派生类B已经重载了基类A的什么叫做多态性?
在C++中是如何实现多态的?
答:
多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。
C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。
25.一个成员函数fn1(),没有重载成员函数fn2(),如何调用基类的成员函数fn1()、fn2()?
答:
A:
:
fn1();fn2();
26.如果类A是类B的友元,类B是类C的友元,类D是类A的派生类,那么类B是类A的友元吗?
类C是类A的友元吗?
类D是类B的友元吗?
答:
类B不是类A的友元,类C不是类A的友元,类D不是类B的友元
二、选择题
1. 下列的各类函数中, C 不是类的成员函数。
A)构造函数 B)析构函数
C)友元函数 D)拷贝初始化构造函数
2.作用域运算符“:
:
”的功能是 D 。
A)标识作用域的级别的
B)指出作用域的范围的
C)给定作用域的大小的
D)标识成员是属于哪个类的
3. A 是析构函数的特征。
A)一个类中只能定义一个析构函数
B)析构函数名与类名不同
C)析构函数的定义只能在类体内
D)析构函数可以有一个或多个参数
4下述静态数据成员的特性中, D 是错误的。
A)说明静态数据成员时前边要加修饰符static
B)静态数据成员要在类体外进行初始化
C)引用静态数据成员时,要在静态数据成员前加<类名>和作用域运算符
D)静态数据成员不是所有对象所共用的
5. 友元关系不能 C
A)是类是与类的关系
B)是一个类成员函数与另一个类的关系
C)继承 D)提高程序的运行效率
6.下列关于对象数组的描述中, D 是错的。
A)对象数组的下标是从0开始的
B)对象数组的数组名是一个常量指针
C)对象数组的每个元素是同一个类的对象
D)对象数组只能赋初值,而不能被赋值
7. 下列说明中constchar*ptr; ptr应该是 C
A)指向字符常量的指针
B)指向字符的常量指针
C)指向字符串常量的指针
D)指向字符串的常量指针
8. 已知:
print()函数是一个类的常成员函数,它无返回值,下列表示中, A 是正确的。
A)voidprint()const; B)constvoidprint();
C)voidconstprint():
D)voidprint(const);
9. 关于new运算符的下列描述中, D 是错的。
A)它可以用来动态创建对象和对象数组
B)使用它创建的对象或对象数组可以使用运算符delete删除
C)使用它创建对象时要调用构造函数
D)使用它创建对象数组时必须指定初始值
10. 下列对派生类的描述中, D 是错的
A)一个派生类可以作另一派生类的基类
B)派生类至少有一个基类
C)派生类的成员除了它自己的成员外,还包含了它的基类的成员
D)派生类中继承的基类成员的访问权限到派生类中保持不变
11. 派生类的构造函数的成员初始化列表中,不能包含 D
A)基类的构造函数
B)派生类中子对象的初始化
C)派生类中一般数据成员的初始化
D)基类的子对象初始化
12. 设置虚基类的目的是 B
A)简化程序 B)消除二义性
C)提高运行效率 D)减少目标代码
13. 下列函数中, C 不能重载
A)成员函数 B)非成员函数
C)析构函数 D)构造函数
注:
重载函数:
同名不同参(个数、类型、顺序)
14. 关于动态联编的下列描述中 D 是错误的
A)动态联编是以虚函数为基础的
B)动态联编是在运行时确定所调用的函数代码的
C)动态联编调用函数操作是指向对象的指针或对象引用
D)动态联编是在编译时确定操作函数的
15. 关于虚函数的描述中, D 是正确的
A)虚函数是一个static类型的成员函数
B)虚函数是一个非成员函数
C)基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数
D)派生类的虚函数与基类的虚函数具有不同的参数个数和类型
16. 下列描述中, D 是抽象类的特性
A)可以说明虚函数
B)可以进行构造函数重载
C)可以定义友元函数
D)不能说明其对象
17. 在类定义的外部,可以被访问的成员有 C
A)所有类成员 B)private的类成员
C)public的类成员
D)public或private的类成员
18.下面对构造函数的不正确描述是 B
A)系统可以提供默认的构造函数
B)构造函数可以有参数,所以可以有返回值没有
C)构造函数可以重载
D)构造函数可以设置默认参数
19. 在创建派生类对象时,构造函数的执行顺序是 D
A)对象成员构造函数、基类构造函数、派生类本身的构造函数
B)派生类本身的构造函数、基类构造函数、对象成员构造函数
C)基类构造函数、派生类本身的构造函数、对象成员构造函数
D)基类构造函数、对象成员构造函数、派生类本身的构造函数
20. 在C++中,要实现动态联编,必须使用 D 调用虚函数
A)类名 B)派生类指针
C)对象名 D)基类指针
三、运行结果
1.在你的计算机上运行下面的程序:
#include
usingnamespacestd;
intmain()
{doublea=3.3,b=1.1;
inti=a/b;
cout<
return0;
}
结果与你预期的是否相符?
如果不符,请解释它的原因
结果为2。
小数3.3和1.1无法用double型精确表示。
结果比3.0小,所以转换成int型后为2
2.写出下面程序的执行结果:
#include
usingnamespacestd;
intcount=0;
intfib(intn)
{count++;
if(n==1||n==2)
return1;
else
returnfib(n-1)+fib(n-2);
}
intmain()
{cout< cout<<','< return0; } 递归。 。 。 。 结果: 21,41 3.#include classCPoint {public: CPoint(){X=Y=0;cout<<”缺省构造(”< CPoint(intx0,inty0){X=x0;Y=y0;cout<<”构造(”< ~CPoint(){cout<<”析构(”< private: intX,Y; }; voidmain() {CPointp1(3,4),p2;} 运行结果: 构造(3,4) 缺省构造(0,0) 析构(0,0) 析构(3,4) 4.#include classBase {public: Base(){cout<<"Base"< }; classLevel1: virtualpublicBase { public: Level1(){cout<<"Level1"< } }; classLevel2: virtualpublicBase { public: Level2(){cout<<"Level2"< } }; classToplevel: publicLevel1,publicLevel2 { public: Toplevel(){cout<<"TopLevel"< } }; voidmain(){Toplevelt;}: 运行结果: Base Leve11 Leve12 TopLeve1 5.classB1 {public: B1(inti){cout<<"constructingB1"< ~B1(){cout<<"destructingB1"< }; classB2 {public: B2(intj){cout<<"constructingB2"< ~B2(){cout<<"destructingB2"< }; classB3 {public: B3(){cout<<"constructingB3*"< ~B3(){cout<<"destructingB3"< }; classC: publicB2,publicB1,publicB3 {public: C(inta,intb,intc,intd): B1(a),memberB2(d),memberB1(c),B2(b){} private: B1memberB1; B2memberB2; B3memberB3; }; voidmain() {Cobj(1,2,3,4);} 运行结果: constructingB22 constructingB11 constructingB3* constructingB13 constructingB24 constructingB3* destructingB3 destructingB2 destructingB1 destructingB3 destructingB1 destructingB2 6.编写函数reverse(char*s)的倒序递归程序,使字符串s倒序#include 参考答案: #include usingnamespacestd; voidreverse(char*s,char*t) {charc; if(s {c=*s; *s=*t; *t=c; reverse(++s,--t);}} voidreverse(char*s) {reverse(s,s+strlen(s)-1);} voidmain() {charstr1[20]; cout<<"输入一个字符串: "; cin>>str1; cout<<"原字符串为: "< reverse(str1); cout<<"倒序反转后为: "< } 程序运行输出: 输入一个字符串: abcdefghijk 原字符串为: abcdefghijk 倒序反转后为: kjihgfedcba 7.定义一个tree类,有成员ages,成员函数grow(intyears)对ages加上years,age()显示tree对象的ages的值。 参考算法: #include usingnamespacestd; classTree{ intages; public: Tree(intn=0);//复制构造函数 ~Tree(); voidgrow(intyears);//声明了成员函数 voidage(); }; Tree: : Tree(intn){//复制构造函数的实现 ages=n; } Tree: : ~Tree(){ age(); } voidTree: : grow(intyears){//定义了之前声明的两个函数 ages+=years; } voidTree: : age(){ cout<<"这棵树的年龄为"< } voidmain() { Treet(12); t.age();//需要计算,最后输出。 t.grow(4); } 程序运行输出: 这棵树的年龄为12 这棵树的年龄为16 四、编程题 1.编写一个程序,将华氏温度转换为摄氏温度。 转换公式为: c= (f-32),其中,c为摄氏温度,f为华氏温度 解: #include usingnamespacestd; intmain() {doublec,f; cout<<"PleaseinputanF-temperature: "< cin>>f; c=(f-32)*5/9; cout<<"TheC-temperatureis: "< return0; } 2.编写一个程序,分别按正向和逆向输出小写字母a~z。 vari: byte; begin fori: =ord('a')toord('z')do write(chr(i)); writeln; fori: =ord('z')downtoord('a')do write(chr(i)); end. intmain(){ inti; for(i='a',i<='z',i++)//没错! { printf("%c",i); } for(i='z',i>='a',i--){ printf("%c",i); } } 3.编写一个程序,从键盘输入一个正整数,判断该正整数为几位数,并输出其位数。 #include usingnamespacestd; intmain() {unsignedintZ; intcount=0; while (1) {cout<<"Pleaseinputaninteger(greaterthanzero): "< cin>>Z; if(Z<=0) cout<<"Yourinputiswrong! Pleaseinputagain..."< else break; } while(Z! =0) {Z=Z/10; count++; } cout<<"Thenumberofdigitsintheintergeris: "< return0; } 4.编写一个程序,求所有这样的三位数,它们等于它们的各位数字的立方和。 例如: 153=13+33+53 #include usingnamespacestd; intmain() { intnum; inti=0; cout<<"Enteranumber: "; cin>>num; while(num>0) { i++; num=num/10; } cout<<"Thisnumberbi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 C+ 复习题