第1章 C++语言概述
1.2 单选题
1.下列关于面向对象概念的描述中,错误的是(C)。
A.面向对象方法比面向过程方法更加先进
B.面向对象方法中使用了一些面向过程方法中没有的概念
C.面向对象方法替代了结构化程序设计方法
D.面向对象程序设计方法要使用面向对象的程序设计语言
2.下列各种高级语言中,不是面向对象的程序设计语言是(D)。
A.C++ B.Java
C.VB D.C
3.下列关于类的描述中,错误的是(A )。
A.类就是C语言中的结构类型
B.类是创建对象的模板
C.类是抽象数据类型的实现
D.类是具有共同行为的若干对象的统一描述体
4.下列关于对象的描述中,错误的是(C )。
A.对象是类的一个实例
B.对象是属性和行为的封装体
C.对象就是C语言中的结构变量
D.对象是现实世界中客观存在的某种实体
5.下列关于C++程序中使用提取符和插入符的输入/输出语句的描述中,错误的是(C )。
A.提取符是对右移运算符(>>)重载得到的
B.插入符是对左移运算符(<<)重载得到的
C.提取符和插入符都是双目运算符,它们要求有两个操作数
D.提取符和插入符在输入/输出语句中不可以连用
1.3 填空题
1.C++语言具有面向对象方法中要求的三大特性:封装性、继承性和多态性。
2.C++程序中,有且仅有一个主函数。
3.C++程序是由类和函数组成的。
4.C++源程序的扩展名是cpp。
5.使用插入符进行标准输出文件输出时,使用的输出流对象名是cout 。
1.4 上机调试下列程序,并分析输出结果
1.
#include
void main()
{
int i,j;
cout<<"Enter i j: ";
cin>>i>>j;
cout<<"i="<
cout<<"i+j="<
假定,输入数据如下:
Enter x y:5?9●
答:i=5,j=9
i+j=14,i *j=45
2.
#include
int max(int,int);
void main()
{
int a,b,c;
a=5;
b=8;
c=max(a,b);
cout<<"max("< } int max(int x,int y) { return x>y?x:y; } 答:max(5,8)=8 1.5 编译下列程序,修改所出现的错误,获得正确结果1. main() { cout<<"In main().\n" } 答:修改后如下: #include void main() { cout<<"In main().\n"; } 2. #include void MAIN() { cin>>a; int b=a+a; cout<<"b=< } 答:修改后如下: #include void main() int a; cin>>a; int b=a+a; cout<<"b=”< } 3. #include void main() { int i,j; i=5; int k=i+j; COUT<<"i+j="< } 答: #include void main() { int i,j; j=10; i=5; int k=i+j; cout<<"i+j="< } 2.2 单选题 1.下列变量名中,非法的是(C)。 A.A25 B.My_car C.My-str D.abc 2.下列常量中,十六进制int型常量是( A )。 A.0x5f B.x2a C.046 D.7a 3.下列常量中,不是字符常量的是(B)。 A.'\n' B."y" C.'x' D.'\7' 4.在函数体内定义了下述变量a,a的存储类为(D)。 int a; A.寄存器类B.外部类 C.静态类D.自动类 5.下列关于变量存储类的描述中,错误的是(C)。 A.任何变量定义后都具有一个确定的存储类 B.变量的存储类确定了变量的作用域和寿命 C.定义变量时没有存储类说明符者一律为自动类 D.内部静态类变量和外部静态类变量的存储类说明符都是static 6.下列关于变量数据类型的描述中,错误的是(A)。 A.定义变量时int型数据类型可以省略 B.变量的数据类型可以决定该变量占内存的字节数 C.变量的数据类型是可以被强制的 D.变量的数据类型是有高低之分的 7.长双精度浮点型常量的后缀是(C)。 A.U B.F C.L D.无 8.下列运算符中,不能用于浮点数操作的是(D)。 A.++ B.+ C.*= D.&(双目) 9.下列运算符中,优先级最高的是(A)。 A.*(双目)B.|| C.>> D.%= 10.下列运算符中,优先级最低的是(B)。 A.== B.?: C.| D.&& 11.已知:int a(3);下列表达式中,错误的是(C )。 A.a%2==0 B.a--+2 C.(a 2)++ D.a>>=2 12.已知:int b(5),下列表达式中,正确的是(D )。 A.b="a" B.++(b 1) C.b%2.5 D.b=3,b+1,b+2 13.下列关于类型转换的描述中,错误的是(C)。 A.类型转换运算符是(<类型>) B.类型转换运算符是单目运算符 C.类型转换运算符通常用于保值转换中 D.类型转换运算符作用于表达式左边 14.下列表达式中,其值为0的是(A)。 A.5/10 B.!0 C.2>4?0:1 D.2&&2||0 15.下列表达式中,其值不为逻辑值的是(A)。 A.算术表达式B.关系表达式 C.逗号表达式D.逻辑表达式 16.下列关于数组概念的描述中,错误的是(B)。 A.数组中所有元素类型是相同的 B.数组定义后,它的元素个数是可以改变的 C.数组在定义时可以被初始化,也可以不被初始化 D.数组元素的个数与定义时的每维大小有关17.下列关于数组维数的描述中,错误的是(C )。 A.定义数组时必须将每维的大小都明确指出 B.二维数组是指该数组的维数为2 C.数组的维数可以使用常量表达式 D.数组元素个数等于该数组的各维大小的乘积 18.下列关于数组下标的描述中,错误的是(B)。 A.C++语言中数组元素的下标是从0开始的 B.数组元素下标是一个整常型表达式 C.数组元素可以用下标来表示 D.数组元素的某维下标值应小于该维的大小值 19.下列关于初始值表的描述中,错误的是(C)。 A.数组可以使用初始值表进行初始化 B.初始值表是用一对花括号括起的若干个数据项组成的 C.初始值表中数据项的个数必须与该数组的元素个数相等 D.使用初始值表给数组初始化时,没有被初始化的元素都具有默认值20.下列关于字符数组的描述中,错误的是(D)。 A.字符数组中的每一个元素都是字符 B.字符数组可以使用初始值表进行初始化 C.字符数组可以存放字符串 D.字符数组就是字符串 21.下列关于字符串的描述中,错误的是(C)。 A.一维字符数组可以存放一个字符串 B.二维字符数组可以存放多个字符串 C.可以使用一个字符串给二维字符数组赋值 D.可以用一个字符串给二维字符数组初始化 22.已知:int a[5] = {1, 2, 3, 4}; 下列数组元素值为2的数组元素是(B)。 A.a[0] B.a[1] C.a[2] D.a[3] 23.已知:int ab[ ][3] = {{1, 5, 6}, {3}, {0,2}}; 数组元素ab[1][1]的值为(A)。 A.0 B.1 C.2 D.3 24.已知:char s[ ]="abcd";输出显示字符'c'的表达式是(C)。 A.s B.s+2 C.s[2] D.s[3] 25.已知:char ss[ ][6]={"while", "for", "else", "break"};输出显示"reak"字符串的表达式是(B)。 A.ss[3] B.ss[3]+1 C.ss+3 D.ss[3][1] 2.3 填空题 1.C++语言中,基本数据类型包含有整型、浮点型、字符型、空值型和布尔型。2.变量的存储类可分为自动类、寄存器类、外邹类和静态存储类。 3.浮点型常量可分为单精度、双精度和长双精度浮点型常量。 4.结合性从右至左的运算符有单目运算符、双目运算符和赋值运算符。 5.条件表达式是由三目运算符组成的,该表达式的类型是由冒号左边和右边两个操作数中类型高的操作数类型决定的。 6.已知:double dd[ ][3]={{1.2, 2.4, 3.6}, {4.8, 5.2},{6.4}}; 这里dd是一个二维数组的数组名,该数组共有9个元素,每个元素的类型是double。数组元素dd[0][0]的值是 1.2 ,dd[1][1]的值是5.2,数组元素dd[2][2]的值是0。 7.已知:char ss[ ][6]={"while", "break", "for", "else"}; 字符数组ss是二维数组,它的第 1维大小应该是4 。使用cout和<<输出字符串"for"时,对应的表达式是ss+2。使用cout和<<输出字符串"break"的子串"reak"时,对应的表达式是ss[1]+1。使用cout和<<输出字符串else中的字符's'时,对应的表达式是ss[3][2] 。 2.4 分析下列程序 2. #include void main() { const int A=8; const char CH='k'; const double D=8.5; cout<<"A="< cout<<"CH+2="< cout<<"D-5.8="< } 答:A=8 CH=2=m D-5.8=2.7 3. #include int a=9; void main() { int b=5; cout<<"a+b="< static int c; cout<<"c+a="< const long int d=8; cout<<"a+d-b="< } 答:a+b=14 c+a=9 a+d-b=12 4. #include void main() { int a=3; char b='m'; cout<<"a="< { int a=5; b='n'; cout<<"a="< } cout<<"a="< } 答:a=5,b=m a=3,b=n a=3,b=n 3.2 单选题 1.下列关于语句的描述中,错误的是(A )。 A.C++程序中的函数是由若干条语句组成的 B.每条语句都要实现某种操作 C.条件语句是用来实现分支操作的 D.循环语句是用来在一定条件下重复执行某段程序的 2.下列关于条件语句的描述中,错误的是(C)。 A.if语句中最多只能有一个else子句 B.if语句的if体内可以出现开关语句 C.if语句中else if子句和else子句的顺序是没有限制的 D.if语句中else子句是与它最近的if子句配对的 3.下列关于开关语句的描述中,错误的是(B)。 A.开关语句中,case子句的个数是不受限制的 B.开关语句中,case子句的语句序列中一定要有break语句 C.开关语句中,default子句可以省略 D.开关语句中,右花括号具有退出开关语句的功能 4.下列关于循环语句的描述中,错误的是(A)。 A.while循环语句中<条件>给定的表达式不能为非0的常量,否则便是死循环 B.for循环语句的循环体内可以出现while循环语句、do-while循环语句和for循环语句 C.循环语句的循环体可以是空语句 D.循环语句的循环体内可以出现break语句,也可以出现continue语句 5.已知:int i(3);下列do-while循环语句的循环次数是(D)。 do{ cout< i--; }while(i!=0); A.0 B.3 C.1 D.无限 6.下列for循环语句的循环次数是(B )。 for(int i(0), j(5); i=3; i++, j--); A.3 B.无限 C.5 D.0 7.下列while循环语句的循环次数是( A )。 while(int i(0)) i--; A.0 B.1 C.2 D.无限 8.下列程序段执行后,j值是(B)。 for(int i(0), j(0); i<10; i++) if(i) j++; A.0 B.9 C.10 D.无限 9.已知:typedef char CH;下列描述中,正确的是(A)。 A.使用CH定义的变量是char型变量 B.使用CH定义的是一个字符常量 C.使用CH定义的变量其类型不确定 D.使用CH定义的是一个字符串 10.下列关于预处理命令的描述中,错误的是(D)。 A.预处理命令最左边的标识符是# B.预处理命令是在编译前处理的 C.宏定义命令可以定义符号常量 D.文件包含命令只能包含.h文件 3.3 填空题 1.表达式语句是一个表达式后边加上分号(;)组成的。空语句是只有一个分号的语句。 2.复合语句是由两条条或两条条以上的语句加上花括号({})组成的。 3.分程序是一种带有说明语句的复合语句。 4.循环语句的共同特点是都应具有循环体和退出循环的条件。 5.下列程序是求100之内的能被7整除的自然数之和。 #inelude void main( ) { int sum; _sum=0_; for(int i(1);__i<=100_; i++) if(_i%7==0__) sum+=i; cout< } 3.4 上机调试下列程序,并分析其输出结果 1. #include void main() { int a(8),b(5); if(!a) b--; else if(b) if(a) a++; else a--; else b++; cout< } 答:9,5 2. #include void main() { int a(10); while(--a) { if(a==5) break; if(a%2==0&&a%3==0) continue; cout< } } 答:9 8 7 3. #include void main() { int b(10); do { ++b; cout<<++b< if(b==15) break; }while(b<15); cout<<"ok! "< } 答:12 14 16 ok! 4. #include void main() { int w(5); do { switch(w%2) { case 1: w--; break; case 0: w++; break; } w--; cout< }while(w>0); } 答: 3 1 -1 5. #include void main() { int a(4),b(5),i(0),j(0); switch(a) { case 4: switch(b) { case 4: i++; break; case 5: j++; break; default: i++;j++; } case 5: i++; j++; break; default: i++;j++; } cout< } 答:1,2 6. #include void main() { int b(10); for(int i=9;i>=0;i--) { switch(i) { case 1: case 4: case 7: b++;break; case 2: case 5: case 8: break; case 3: case 6: case 9: b+=2; } } cout< } 答:19 4.2 单选题 1.下列关于定义一个指向double型变量的指针,正确的是(B)。 A.int a(5);double *pd=a;B.double d(2.5),*pd=&d; C.double d(2.5),*pd=d;D.double a(2.5),pd=d; 2.下列关于创建一个int型变量的引用,正确的是(A)。 A.int a(3),&ra=a;B.int a(3),&ra=&a; C.double d(3.1);int &rd=d;D.int a(3),ra=a; 3.下列关于指针概念的描述中,错误的是(B)。 A.指针中存放的是某变量或对象的地址值 B.指针的类型是它所存放的数值的类型 C.指针是变量,它也具有一个内存地址值 D.指针的值(非常量指针)是可以改变的 4.下列关于引用概念的描述中,错误的是(A)。 A.引用是变量,它具有值和地址值 B.引用不可以作数组元素 C.引用是变量的别名 D.创建引用时必须进行初始化 5.已知:int a[5],*p=a;则与++*p相同的是(D)。 A.*++p B.a[0] C.*p++ D.++a[0] 6.已知:int a[ ]={1,2,3,4,5},*p=a;在下列数组元素地址的表示中,正确的是(C)。 A.&(a+1) B.&(p+1) C.&p[2] D.*p++ 7.已知:int a[3][4],(*p)[4];下列赋值表达式中,正确的是(A)。 A.p=a+2 B.p=a[1] C.p=*a D.p=*a+2 8.已知:int b[3][5]={0};下列数组元素值的表示中,错误的是(D)。 A.**(b+1) B.(*(b+1))[2] C.*(*(b+1)+1) D.*(b+2) 9.已知:int a=1,b=2,*p[2];下列表达式中正确的是(C)。 A.p=&a B.p=&b C.p[0]=&a,p[1]=&b D.p[ ]={&a,&b}; 10.已知:int a(5),&ra=a;下列描述中,错误的是(D)。 A.ra是变量a的引用,即为变量的别名B.ra的值为5 C.ra的地址值为&a D.改变ra的值为10,变量a值仍为5 4.3 填空题 1.单目运算符&作用在变量名左边,表示该变量的地址值,单目运算符*作用在指针名的左边,表示取该变量的值。 2.指向一维数组元素的指针是一级指针,指向二维数组元素的指针是一级指针,指向一维数组的指针是二级指针,指向一级指针的指针是二级指针,一维一级指针数组名是 二级指针的地址值,二维数组的数组名是二级指针的地址值。 3.在一个二维数组b[3][5]中,b[0]与*b是等价的,&b[1]与b+1是等价的。 4.指针的运算有4种,它们是赋值运算、一个指针加减整型数的运算、两个指针相减和比较运算。 5.引用不是变量,它是某个变量或对象的别名。引用的值是被引用的变量的值,引用的地址值是被引用的变量的地址值。 4.4 分析下列程序的输出结果 1. #include void main() { int a[]={5,4,3,2,1}; int *p=&a[2]; int m(5),n; for(int i(2);i>=0;i--) { n=(*(p+i)<*a)?*(p+i):*a; cout< } } 答: 1 2 3 5.2 单选题 1.当一个函数没有返回值时,该函数类型应说明为(A)。 A.void B.int C.无D.任意 2.下列关于设置函数默认的参数值的描述中,错误的是(C)。 A.可对函数的部分参数或全部参数设置默认值 B.在有函数说明时,默认值应设置在函数说明时,而不是定义时 C.设置函数默认参数值时,只可用常量不可用含有变量的表达式 D.设置函数参数默认值应从右向左设置 3.下列关于被调用函数中return语句的描述中,错误的是(D)。 A.一个函数中可以有多条return语句 B.return语句具有返回程序控制权的作用 C.函数通过return语句返回值时仅有一个 D.一个函数中有且仅有一条return语句 4.函数返回值的类型是由(B)决定的。 A.调用该函数的调用函数的类型 B.定义该函数时所指定的类型 C.return语句中表达式的类型 D.接收函数返回值的变量或对象的类型 5.下列设置函数参数默认值的说明语句中,错误的是(C)。 A.int fun(int x , int y=10); B.int fun(int x=5, int =10); C.int fun(int x=5, int y); D.int fun(int x , int y=a+b); (其中,a和b是已定义过具有有效值的变量) 6.下列选择重载函数的不同实现的判断条件中,错误的是(D)。 A.参数类型不同B.参数个数不同 C.参数顺序不同D.函数返回值不同 7.已知:int fun (int &a),m=10;下列调用fum()函数的语句中,正确的是(C)。 A.fun(&m); B.fun (m*2); C.fun (m); D.fun (m++); 8.在函数的引用调用中,函数的实参和形参分别应是(C)。 A.变量值和变量B.地址值和指针 C.变量名和引用D.地址值和引用 9.在函数的传址调用中,函数的实参和形参分别应是(B)。 A.变量值和变量B.地址值和指针 C.变量名和引用D.地址值和引用 10.说明一个内联函数时,应加关键字是(A)。 A.inline B.static C.void D.extern 5.3 填空题 1.如果将调用一个函数的过程分为3个步骤,第1步是转去执行被调用函数,第2步是执行被调用函数的语句,第3步是返回操作。 2.函数的存储类分两种,它们分别是外部函数和内部函数,其中内部函数的存储类说明不可省略,该说明符是static 。 3.使用关键字inline说明的函数称为内联函数,具有相同函数名但具有不同实现的函数称为重载函数。 4.在调用一个函数过程中可以直接或间接地调用该函数,则该函数称为被调用函数。这种调用称为嵌套调用。 5.在引用调用中,函数实参用变量名,形参用引用名。 5.4 分析下列程序的输出结果 1. #include int fun(int n) { int p(1),s(0); for(int i(1);i { p*=i; s+=p; } return s; } void main() { int s=fun(4); cout< } 答:9 7. #include void swap(int &,int &); void main() { int a(8),b(5); cout<<"a="< swap(a,b); cout<<"a="< } void swap(int &i,int &j) { int t; t=i; i=j; j=t; } 答:a=8,b=5 a=5,b=8 6.2 单选题 1.下列关于类的定义格式的描述中,错误的是(C)。 A.类中成员有3种访问权限 B.类的定义可分说明部分和实现部分 C.类中成员函数都是公有的,数据成员都是私有的 D.定义类的关键字通常用class,也可用struct 2.下列关键字中,不属于定义类时使用的关键字是(D)。 A.class B.struct C.public D.default 3.下列关于成员函数的描述中,错误的是(A)。 A.成员函数的定义必须在类体外 B.成员函数可以是公有的,也可以是私有的 C.成员函数在类体外定义时,前加inline可为内联函数 D.成员函数可以设置参数的默认值 4.下列关于对象的描述中,错误的是(D)。 A.定义对象时系统会自动进行初始化 B.对象成员的表示与C语言中结构变量的成员表示相同 C.属于同一个类的对象占有内存字节数相同 D.一个类所能创建对象的个数是有限制的 5.下列关于构造函数的描述中,错误的是(C)。 A.构造函数可以重载 B.构造函数名同类名 C.带参数的构造函数具有类型转换作用 D.构造函数是系统自动调用的 6.下列关于析构函数的描述中,错误的是(A)。 A.析构函数的函数体都为空 B.析构函数是用来释放对象的 C.析构函数是系统自动调用的 D.析构函数是不能重载的 7.下列关于静态成员的描述中,错误的是(C )。 A.静态成员都是使用static来说明的 B.静态成员是属于类的,不是属于某个对象的 C.静态成员只可以用类名加作用域运算符来引用,不可用对象引用 D.静态数据成员的初始化是在类体外进行的 8.下列关于常成员的描述中,错误的是(C)。 A.常成员是用关键字const说明的 B.常成员有常数据成员和常成员函数两种 C.常数据成员的初始化是在类体内定义它时进行的 D.常数据成员的值是不可以改变的 9.下列关于友元函数的描述中,错误的是(B)。 A.友元函数不是成员函数 B.友元函数只可访问类的私有成员 C.友元函数的调用方法同一般函数 D.友元函数可以是另一类中的成员函数 10.下列关于类型转换函数的描述中,错误的是(C)。 A.类型转换函数是一种成员函数 B.类型转换函数定义时不指出类型,也没有参数 C.类型转换函数的功能是将其函数名所指定的类型转换为该类类型 D.类型转换函数在一个类中可定义多个 6.3 填空题 1.类体内成员有3个访问权限,说明它们的关键字分别是公有、私有和保护。 2.使用class定义的表中,成员的默认访问权限是私有的;由struct定义的类中,成员的默认的访问权限是公有的。 3.如果一个类中没有定义任何构造函数时,系统会自动提供一个默认构造函数;同样,类中没有定义析构函数时,系统会自动提供一个默认析构函数。 4.静态成员是属于类的,它除了可以通过对象名来引用外,还可以使用 类名限定来引用。 5.友元函数是被说明在类体内的非成员函数。友元函数可访问该类中的成员。 6.完成下列类的定义。 class A { public: A() { a=0; } int int Geta( A &m); private: int a; }; int Geta( A &m) { return m.a; } 6.4 分析下列程序的输出结果 1. #include class A { public: A() { a1=a2=0; cout<<"Default constructor called.\n"; } A(int i,int j); ~A() { cout<<"Destructor called.\n"; } void Print() { cout<<"a1="< int a1,a2; }; A::A(int i,int j) { a1=i; a2=j; cout<<"Constructor called.\n"; } void main() { A a,b(5,8); a.Print(); b.Print(); } 答:Default constructor called. Constructor called. a1=0,a2=0 a1=5,a2=8 Destructor called. Destructor called. 2. #include class B { public: B() { cout<<++b< ~B() { cout< static int Getb() { return b; } private: static int b; }; int B::b=10; void main() { B b1,b2,b3; cout< } 答:11 12 13 13 13 12 11 3. #include class Date { public: Date(int y,int m,int d) { year=y; month=m; day=d; } friend void Print(Date &); private: int year,month,day; }; void Print(Date &d) { cout< void main() { Date d1(2005,10,1),d2(2005,12,9); Print(d1); Print(d2); } 答:2005/10/1 2005/12/9 6.5 编程题 1.按下列要求编程: (1)定义一个描述矩形的类Rectangle,包括的数据成员有宽(width)和长(length); (2)计算矩形周长; (3)计算矩形面积; (4)改变矩形大小。 通过实例验证其正确性。 答:编程如下: #include class Rectangle { public: Rectangle(int a,int b) { width=a; length=b; } int Area() { return width*length; } int Periment() { return 2*(width+length); } void Changesize(int a,int b) { width=a; length=b; } void Print(); private: int width,length; }; void Rectangle::Print() { cout<<"AREA="< cout<<"PERIMENT="< } void main() { Rectangle r(5,8); r.Print(); r.Changesize(3,9); r.Print(); } . 7.4 分析下列程序的输出结果 1. #include class A { public: A(int i) { a=i; } A() { a=0; cout<<"Default constructor called."< ~A()