1、C+复习题一、简答题1在 c+中,内联函数中不能使用什么语句?答:不允许使用循环语句和分支语句2在 c+中,封装可以由那几个关键字提供控制方式?分别作用是什么?答:在类定义体里,使用了private、protected、public 三个关键字是用来说明数据成员和函数成员的访问权限 。 public 说明公有成员,该类成员都可以通过对象被访问的。private 说明私有成员,该类成员只能被自己的成员函数或友元访问;protected 说明保护型的成员,可以被自己的成员函数或友元访问,也可以被派生类的函数成员访问;3由于二义性原因,一个类如何防止从一个类中重复继承? 答:通过使用作用运算符“:”
2、明确指出访问的是哪个基类中的成员;在类中定义同名成员;虚基类(virtual 继承方式 基类名)4在 c+中,如果在多条继承路径有一个公共的基类,如果想使这个公共的基类只产生一个拷贝,则如何处理这个基类?用什么关键字?答:将这个公共基类说明为虚基类,用 virtual 关键字5简单成员函数是指声明中不含有什么关键字的函数?(关注存储类型)答:简单成员函数是指存储类型为 auto 型。static,extern,register6静态成员的特点? 答:静态成员的特点是:不管这个类创建多少个对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象所共享。7当访问私有静态数据成员时,可通过什
3、么来访问?答:在类外,私有静态数据成员不能直接访问,必须通过公有的成员函数访问。8有关继承,静态成员是否可以被继承?可以。友元是否可以被继承?不可以构造函数是否可以被继承?不可以9c+不允许重载什么运算符?答:成员访问运算符.;作用域运算符;条件运算符?: ;成员指针 运算符*;长度运算符 sizeof()10那些运算符只能用类运算符来重载?答:= () * 这四个只能用类重载11c+提供格式宽度控制方式有哪几种?关键字是?答1.int width(int val) int width( ) int ios:width(int n) 2.setw(int n) 12十进制数 0.1 的二进制表
4、示是什么?答:(0.1)10 = (0.000110011.)2,它是无限循环小数。也就是说,十进制数0.1无法精确用二进制表示!13 简述程序设计的步骤。答:程序设计一般遵循以下步骤:明确问题; 系统设计; 用某种语言进行编程; 测试与调试; 运行与维护14简述编译与解释的区别。答:编译是指把高级语言程序首先翻译成功能上等价的机器语言程序或汇编语言程序,然后执行目标代码程序,在目标代码程序的执行中不再需要源程序。解释则是指对源程序中的语句进行逐条翻译并执行,翻译完了程序也就执行完了,这种翻译方式不产生目标程序。一般来说,编译执行比解释执行效率要高15简述 C程序的编译执行过程答:编译过程主要
5、分为 4 个阶段:编译预处理;编译、优化阶段;汇编过程;链接程序(?)16下面哪一些是合法的 C+字面常量,它们的类型是什么?-5.23, 1e+50, -25, 105, 20 .20, e5, 1e-5, -0.0e5, n-000, A, 5, 3.14, falsered, r, f “Today is Monday.“, “答:字面常量是指在程序中直接写出常量值的常量。-5.23, 1e+50,-25, 20 ,.20, 1e-5, -0.0e5, n, -000, A, 5, r, f , “Today is Monday.“, “都是字面常量。其中:整数类型常量:-25, 20,
6、 -000实数类型常量:-5.23, 1e+50 , .20, 1e-5, -0.0e5字符常量: n, A, 5, r, f字符串常量:“Today is Monday.“, “17什么是符号常量?符号常量的优点是什么?答:符号常量是指有名字的常量,在程序中通过常量的名字来使用这些常量。程序中使用符号常量有以下优点:(1)增加程序易读性;(2)提高程序对常量使用的一致性;(3)增强程序的易维护性18如何理解变量?变量定义和声明的作用是什么答:值可以改变的量叫变量,可变的数据.使用变量前,C+要对变量做声明19指针类型主要用于什么场合?引用类型与指针类型相比,其优势在哪里?答:指针类型主要用于
7、参数传递和对动态变量的访问。在 C+中,指针类型还用于访问 数组元素,以提高访问效率。引用类型与指针类型都可以实现通过一个变量访问另一个变量,但访问的语法形式不同:引用是采用直接访问形式,指针则采用间接访问形式。在作为函数参数类型时,引用类型参数的实参是一个变量,而指针类型参数的实参是一个变量的地址。除了在定义时指定的被引用变量外,引用类型变量不能再引用其他变量;而指针变量定义后可以指向其他同类型的变量。因此,引用类型比指针类型要安全。20const int * p1 和 int * const p2 的区别是什么?答:const int * p1 是指向常量的指针,指针指向一个常量,无需初始
8、化,指针本身可以改变,但是指针指向的值不能改变。int * const p2 是指向常量的 引用 ,使用时必须初始化,而且初始化后,引用值不可以改变,引用的常量也不能改变。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+的表
9、达式:(1) (可利用 C+标准库中的求acb24平方根的函数:sqrt(x) )(-1*b+sqrt(b*b-4*a*c)/(2*a)(2) )()(csbs:sqrt(s*(s-a)*(s-b)*(s-c)(3) (a*b)/(c*d)345.21rcbdca*(3/(1+(b/(2.5+c)+(4*pi*r*r*r/3)23派生类构造函数执行的次序是怎样的?答:派生类构造函数执行的一般次序为:调用基类构造函数;调用成员对象的构造函数;派生类的构造函数体中的内容。24如果在派生类 B 已经重载了基类 A 的什么叫做多态性 ?在 C+中是如何实现多态的?答:多态是指同样的消息被不同类型的对象
10、接收时导致完全不同的行为,是对类的特定成员函数的再抽象。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 不是类的成员
11、函数。 A) 构造函数 B) 析构函数 C) 友元函数 D) 拷贝初始化构造函数2.作用域运算符“:” 的功能是 D 。 A) 标识作用域的级别的 B) 指出作用域的范围的 C) 给定作用域的大小的 D) 标识 成员是属于哪个 类的3. A 是析构函数的特征。 A) 一个类中只能定义一个析构函数 B) 析构函数名与类名不同C) 析构函数的定义只能在类体内 D) 析构函数可以有一个或多个参数4 下述静态数据成员的特性中, D 是错误的。 A) 说明 静态数据成员时前边要加修饰符 static B) 静态数据成员要在类体外进行初始化C) 引用静态数据成员时,要在静态数据成员前加和作用域运算符D)
12、静态数据成员不是所有对象所共用的5. 友元关系不能 C A) 是类是与类的关系 B) 是一个类成员函数与另一个类的关系C) 继承 D) 提高程序的运行效率6.下列关于对象数组的描述中, D 是错的。A) 对象数组的下标是从 0 开始的 B) 对象数组的数组名是一个常量指针C) 对象数组的每个元素是同一个类的对象 D) 对象数组只能赋初值,而不能被赋值7. 下列说明中 const char *ptr; ptr 应该是 C A) 指向字符常量的指针 B) 指向字符的常量指针 C) 指向字符串常量的指针 D) 指向字符串的常量指针8. 已知:print()函数是一个类的常成员函数,它无返回值,下列表
13、示中, A 是正确的。 A) void print()const; B) const void print(); C) void const print():D) void print(const);9. 关于 new 运算符的下列描述中, D 是错的。 A) 它可以用来动态创建对象和对象数组 B) 使用它创建的对象或对象数组可以使用运算符 delete删除C) 使用它创建对象时要调用构造函数 D) 使用它创建对象数组时必须 指定初始值10. 下列对派生类的描述中, D 是错的 A) 一个派生类可以作另一派生类的基类 B) 派生类至少有一个基类C) 派生类的成员除了它自己的成员外,还包含了它的
14、基类的成员D) 派生类中继承的基类成员的访问权限到派生类中保持不变11. 派生类的构造函数的成员初始化列表中,不能包含 D A) 基类的构造函数 B) 派生类中子对象的初始化 C) 派生类中一般数据成员的初始化 D) 基类的 子对象初始化12. 设置虚基类的目的是 B A) 简化程序 B) 消除二义性 C) 提高运行效率 D) 减少目标代码13. 下列函数中, C 不能重载A) 成员函数 B) 非成员函数 C) 析构函数 D) 构造函数注:重载函数:同名不同参(个数、类型、顺序)14. 关于动态联编的下列描述中 D 是错误的 A) 动态联编是以虚函数为基础的 B) 动态联编是在运行时确定所调用
15、的函数代码的C) 动态联编调用函数操作是指向对象的指针或对象引用D) 动态联编是在编译时确定操作函数的 15. 关于虚函数的描述中, D 是正确的 A) 虚函数是一个 static 类型的成员函数 B) 虚函数是一个非成员函数C) 基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数D) 派生类的虚函数与基类的虚函数具有不同的参数个数和类型16. 下列描述中, D 是抽象类的特性 A) 可以说明虚函数B) 可以进行构造函数重载 C) 可以定义友元函数 D) 不能说明其对象17. 在类定义的外部,可以被访问的成员有C A) 所有类成员 B) private 的类成员 C) public
16、 的类成员D) public 或 private 的类成员18.下面对构造函数的不正确描述是 B A) 系统可以提供默认的构造函数 B) 构造函数可以有参数,所以可以有返回值 没有C) 构造函数可以重载 D) 构造函数可以设置默认参数19. 在创建派生类对象时,构造函数的执行顺序是D A) 对象成员构造函数、基类构造函数、派生类本身的构造函数B) 派生类本身的构造函数、基类构造函数、对象成员构造函数C) 基类构造函数、派生类本身的构造函数、对象成员构造函数D) 基类构造函数、对象成员构造函数、派生类本身的构造函数20. 在 C+中,要实现动态联编,必须使用 D 调用虚函数 A) 类名 B) 派
17、生类指针 C) 对象名 D) 基类指针三、运行结果1在你的计算机上运行下面的程序:#include using namespace std;int main() double a=3.3, b=1.1;int i=a/b;cout using namespace std;int count=0;int fib(int n) count+;if (n=1 | n=2) return 1;else return fib(n-1)+fib(n-2);int main() cout class CPoint public:CPoint () X=Y=0; coutclass Basepublic:Ba
18、se()cout参考答案:#include using namespace std;void reverse(char *s, char *t) char c;if (s str1;cout using namespace std;class Tree int ages;public:Tree(int n=0); /复制构造函数Tree();void grow(int years);/声明了成员函数void age();Tree:Tree(int n) /复制构造函数的实现ages = n;Tree:Tree() age();void Tree:grow(int years) /定义了之前声明
19、的两个函数ages += years;void Tree:age() cout using namespace std;int main() double c, f;cout f;c = (f - 32) * 5 / 9;cout =a,i-)printf(“%c“,i);3编写一个程序,从键盘输入一个正整数,判断该正整数为几位数,并输出其位数。#include using namespace std;int main() unsigned int Z;int count = 0;while (1) cout Z;if (Zusing namespace std;int main()int n
20、um;int i=0;coutnum;while(num0)i+;num=num/10;coutusing namespace std;int main() int a, b;cout a b;int c=(ab)?b:a;while (c 0) if (a%c = 0 c-;cout using namespace std;int main() int a, b;cout a b;int c;do c = a-b*(a/b);a = b;b = c; while (c != 0);cout =0) x1 = (sqrt(i)-b)/(2*a);x2 = (0-sqrt(i)-b)/(2*a)
21、;return 1;else x1 = (0-b)/(2*a);x2 = sqrt(0-i)/(2*a);return 0;10定义一个 Circle 类,有数据成员半径 Radius,成员函数 GetArea(),计算圆的面积,构造一个 Circle 的对象进行测试。#include using namespace std; class circlepublic:float GetArea();private:float Radius;circle:circle()Radius=1.0;circle:circle(float r)Radius=r;float circle:GetArea()
22、return Radius*Radius*3.14;int main() circle c1;coutusing namespace std;int main()int array5=0; /定义 5 个元素的 int 型数组for(long k=0; karrayk; /接受用户输入值存入数组cout#include using namespace std ;int main()string Str;char ch ;int i=0,cnt=0;cout =a *pInt = 9;cout ;在函数体或复合语句中声明的变量,它们只能在函数体或复合语句中使用,称为局部变量;在函数体外声明的变量
23、,它们可以在多个函数体中使用,通常称为全局变量。8.请说出函数参数中,复制与引用传递参数方式两者之间的异同点。答:复制传递方式是实参的数据拷贝给了形参变量,实参和形参是具有相同数据类型但存储空间是不同的两组空间。在复制传递方式下,被调用函数里对形参的操作不能改变实参的内容。引用传递方式,实参要求为变量,形参为同类型的引用。采用引用方式实参和形参使用的是相同的内存空间,只是名称不同而已。但在引用传递方式下,被调用函数里对形参的操作将改变实参的内容。复制传递方式和引用传递方式都可以将实参传递给被调用函数,并且在被调用函数中使用形式完全相同。9.简述 C+语言具有的特点答:()C+语言是中级的程序设计语言;()是结构式的程序设计语言;()是面向对象的程序设计语言;()功能齐全;()移植性好。