1、提示:1、本练习题、试题集全部来自网上共享资源,包括 C+面向过程和面向对象的相关内容,今下载整理仅为便于复习、练习,请有选择地阅读;2、请同学们做练习题时先独立思考,再参考答案;附后有几套模拟试题,全部来自网上其他院校的期末试卷,供同学们模拟自测。3、试题量大,难免会有错误,请慎重选用、思考。1、数据共享与保护一、选择题:1、在下面存储类中, ( C ) 对象的可见性与生存期不一致。A. 外部类 B. 自动类 C. 内部静态类 D. 寄存器类2、在下面存储类中,( A )的对象不是局部变量。A. 外部静态类 B. 自动类 C. 函数形参 D. 寄存器类3、关于局部变量,下面说法正确的是( C
2、 )。A. 定义该变量的程序文件中的函数都可以访问B. 定义该变量的函数中的定义处以下的任何语句都可以访问C. 定义该变量的复合语句中的定义处以下的任何语句都可以访问D. 定义该变量的函数中的定义处以上的任何语句都可以访问4、一个类的静态数据成员所表示属性 ( C )。A. 是类的或对象的属性 B. 只是对象的属性C. 只是类的属性 D. 类和友元的属性 5、类的静态成员的访问控制( D )。A. 只允许被定义为 privateB. 只允许被定义为 private 或 protected C. 只允许被定义为 public D. 可允许被定义为 private、protected 或 publ
3、ic6、静态成员函数对类的数据成员访问( B )。A. 是不允许的 B. 只允许是静态数据成员 C. 只允许是非静态数据成员 D. 可允许是静态数据成员或非静态数据成员7、被非静态成员函数访问的类的数据成员( A )。A. 可以是非静态数据成员或静态数据成员 B. 不可能是类的静态数据成员C. 只能是类的非静态数据成员 D. 只能是类的静态数据成员8、静态数据成员的初始化是在( D )中进行的。A. 构造函数 B. 任何成员函数C. 所属类 D. 全局区9、当将一个类 A 或函数 f()说明为另一个类 B 的友元后,类 A 或函数 f()能够直接访问类 B 的( D )。A. 只能是公有成员
4、B. 只能是保护成员 C. 只能是除私有成员之外的任何成员 D. 具有任何权限的成员10、引入友元的主要目的是为了( C )。A. 增强数据安全性 B. 提高程序的可靠性C. 提高程序的效率和灵活性 D. 保证类的封装性11、 一个类的成员函数也可以成为另一个类的友元函数,这时的友元说明( A )。A. 需加上类域的限定 B. 不需加上类域的限定C. 类域的限定可加可不加 D. 不需要任何限定二、判断题1、类的静态数据成员需要在定义每个类的对象时进行初始化。F2、当将一个类 S 定义为另一个类 A 的友元类时,类 S 的所有成员函数都可以直接访问类 A 的所有成员。T3、静态数据成员必须在类外
5、定义和初始化。T4、静态成员函数可以引用属于该类的任何函数成员 F。5、友元函数是在类声明中由关键字 friend 修饰说明的类的成员函数。 F6、友元函数访问对象中的成员可以不通过对象名 F三、填空题:1、若“double x=100;”是文件 F1.CPP 中的一个全局变量定义语句,若文件 F2.CPP 中的某个函数需要访问此 x , 则应在文件 F2.CPP 中添加对 x 的声明语句为 Extern double x;2、如果一个函数定义中使用了 static 修饰,则该函数不允许被其它文件中的函数调用。3、定义外部变量时,不用存储类说明符 Extern,而声明外部变量时用它。4、调用系
6、统函数时,要先使用#include 命令包含该系统函数的原型语句所在的头文件。5、C+程序运行时的内存空间可以分成全局数据区,堆区,栈区和代码区。6、局部变量具有局部生存期,存放在内存的栈区中。7、对类中对象成员的初始化是通过在构造函数中给出的初始化表来实现的。8、对类中常量成员的初始化是通过在构造函数中给出的初始化表来实现的。9、对类中引用成员的初始化只能通过在构造函数中给出的初始化表来实现。10、对类中一般数据成员的初始化既可以通过在构造函数中给出的初始化表来实现,也可以通过构造函数中的函数体来实现。11、假定要把 aa 定义为 AB 类中的一个常量整数型数据成员,则定义语句const i
7、nt aa。12、假定要把 aa 定义为 AB 类中的一个引用整数型数据成员,则定义语句为 int public:A_class(int i,int j):x(i),y(j) if(yx)t=x;x=y;y=t;int Variance()return x*x-y*y; /其它函数从略;void main() A_class A_obj(3,5);coutx)t=x;x=y;y=t;friend int Variance(); /其它函数从略;int variance ()return x*x-y*y;void main() A_class A_obj(3,5);coutnext 和 elem
8、Head D. elemTail-next 和 elemTail26、在一个用链表实现的队列类中,假定每个结点包含的值域用 elem 表示,包含的指针域用 next 表示,链队的队首指针用 elemHead 表示,队尾指针用elemTail 表示,若链队为空,则进行插入时必须把新结点的地址赋给( C )。A. elemHead B. elemTailC. elemHead 和 elemTail D. elemHead 或 elemTail27、当类中的一个整型指针成员指向一块具有 n*sizeof(int)大小的存储空间时,它最多能够存储( A )个整数。A. n B. n+1 C. n-1
9、D. 128、假定 AB 为一个类,则执行 “AB *px=new ABn;”语句时将( A )。A. 动态分配一个数组 B. 动态分配一个对象C. 静态分配一个数组 D. 静态分配一个对象29、设 px 是指向一个类对象的指针变量,则执行 “delete px;”语句时,将自动调用该类的( C )。A. 无参构造函数 B. 带参构造函数 C. 析构函数 D. 拷贝构造函数30、当一个类对象离开它的作用域时,系统自动调用该类的( D )。A. 无参构造函数 B. 带参构造函数 C. 拷贝构造函数 D. 析构函数31、假定一个类对象数组为 An,当离开它定义的作用域时,系统自动调用该类析构函数的
10、次数为( C )。A. 0 B. 1 C. n D. n-132、假定 AB 为一个类,则执行 “AB a10;”语句时调用该类无参构造函数的次数为( D )。A. 0 B. 1 C. 9 D. 1033、假定 AB 为一个类,则执行 “AB *px=new ABn;”语句时调用该类无参构造函数的次数为( A )。A. n B. n-1 C. 1 D. 034、假定 AB 为一个类,则执行 “AB a, b(3), *p;”语句时共调用该类构造函数的次数为( A )。A. 2 B. 3 C. 4 D. 535、假定 AB 为一个类,则执行 “AB a(2), b3, *p4;”语句时共调用该类
11、构造函数的次数为( B )。A. 3 B. 4 C. 5 D. 936、假定 AB 为一个类,则执行“AB a, b(2), c3, *p=”语句时共调用该类无参构造函数的次数为( D )A. 5 B. 6 C. 3 D. 437、假定 AB 为一个类,则执行“AB *p=new AB(1,2);”语句时共调用该类构造函数的次数为( B )。A. 0 B. 1 C. 2 D. 338、假定 AB 为一个类,px 为指向该类的一个含有 n 个对象的动态数组的指针,则执行“delete px;”语句时共调用该类析构函数的次数为( C )。A. 0 B. 1 C. n D. n+1二、填空题:1、用
12、于存储一个长度为 n 的字符串的字符数组的长度至少为_n+1_。2、若 a 是一个字符数组,则从键盘上向该数组输入一个字符串的表达式为_getline(cin,a);_。3、若 a 是一个字符数组,则向屏幕输出 a 中所存字符串的表达式为_coutname 等价的表达式是_(*p).name_。46、 与结构成员访问表达式(*fp).score 等价的表达式是_fp-score_。47、已知有定义“int x, a=5,7,9, *pa=a;”,在执行“x=+*pa;”语句后,x 的值是_6_。48、已知有定义“int x, a=6,10,12, *pa=a;”,在执行“x=*+pa;”语句后
13、,*pa 的值是_10_。49、已知有定义“int x, a=15,17,19, *pa=a;”,在执行“x=*pa+;”后,*pa 的值是_17_。50、若采用 p-abc(y)表达式调用一个成员函数,在成员函数中使用的_this_就代表了类外的 p 指针。 51、在一个用数组实现的队列类中,包含有两个数据成员,一个指明队首元素位置,另一个指明_队列长度_。52、在一个用数组实现的队列类中,包含有两个数据成员,一个指明队列长度,另一个指明_队首_元素的位置。53、在一个用数组实现的队列类中,假定数组长度为 MS,队首元素位置为first,队列长度为 length,则插入一个新元素的位置为_(
14、first+length)MS_。54、在一个用数组实现的队列类中,假定数组长度为 MS,队首元素位置为first,队列长度为 length,则删除一个元素后队首的位置为_(first+1)MS _。55、定义类动态对象数组时,其元素只能靠自动调用该类的_无参构造函数_来进行初始化。56、为了释放类对象中指针成员所指向的动态存储空间,则需要为该类定义_析构函数_。57、假定 AB 为一个类,则执行“AB a10;”语句时,系统自动调用该类构造函数的次数为_10_。58、假定一个类对象数组为 AN,当离开它的作用域时,系统自动调用该类析构函数的次数为_N_。60、假定指针 p 指向一个动态分配的
15、类对象,则当执行“delete p;”语句时,在释放 p 所指向的动态存储空间之前将自动调用该类的_析构函数_。61、假定 AB 为一个类,该类中含有一个指向动态数组空间的指针成员 pa,则在该类的析构函数中应该包含有一条_deletepa;_语句。三、程序填空题:1、采用指针访问方式从键盘给数组 aN输入数据,然后对元素值重新按逆序存放并输出。#include const int N=8;void main()int aN,*p,*q;for(p=a; p*p;p=a;q=a+N-1;while(p*p (2) p+ (或+p) (3) q- (或-q)2、假定有定义为“struct NOD
16、Eint data; NODE* next;”,下面算法根据table 数组中的 n 个元素建立一个表头指针为 L 的链表,链表中结点值的顺序与数组元素值的顺序正好相反。void f6(NODE*if(ndata=_ _(2)_;p-next=L;_(3)_;i+;2、(1) is (3) vn-1 (或*(v+n-1)5、已知一个类的定义如下:#includeclass AA int a10;int n;public:void SetA(int aa, int nn); /用数组 aa 初始化数据成员 a,/用 nn 初始化数据成员 nint MaxA(); /从数组 a 中前 n 个元素中
17、查找最大值void SortA(); /采用选择排序的方法对数组 a 中前 n 个元素/进行从小到大排序void InsertA();/采用插入排序的方法对数组 a 中前 n 个元素进行从小到大排序void PrintA(); /依次输出数组 a 中的前 n 个元素;该类中 MaxA()函数的实现如下,请在标号位置补充适当的内容。int _ _(1)_ int x=a0;for(int i=1; ix) _ _(2)_;_(3) _;5、(1) AA:MaxA() (2) x=ai (3) return x6、已知一个类的定义如下:#includeclass AA int a10;int n;
18、public:void SetA(int aa, int nn); /用数组 aa 初始化数据成员 a,/用 nn 初始化数据成员 nint MaxA(); /从数组 a 中前 n 个元素中查找最大值void SortA(); /采用选择排序的方法对数组 a 中前 n 个元素/进行从小到大排序void InsertA();/采用插入排序的方法对数组 a 中前 n 个元素进行从小到大排序void PrintA(); /依次输出数组 a 中的前 n 个元素;void AA:SortA()int i,j;for(i=0; _ _(1)_; i+) int x=ai, k=i;for(j=i+1; j
19、class AA int a10;int n;public:void SetA(int aa, int nn); /用数组 aa 初始化数据成员 a,/用 nn 初始化数据成员 nint MaxA(); /从数组 a 中前 n 个元素中查找最大值void SortA(); /采用选择排序的方法对数组 a 中前 n 个元素/进行从小到大排序void InsertA();/采用插入排序的方法对数组 a 中前 n 个元素进行从小到大排序void PrintA(); /依次输出数组 a 中的前 n 个元素;void _(1)_ int i,j;for(i=1; i=0; j-)if(xclass AA
20、 int a10;int n;public:void SetA(int aa, int nn); /用数组 aa 初始化数据成员 a,/用 nn 初始化数据成员 nint MaxA(); /从数组 a 中前 n 个元素中查找最大值void SortA(); /采用选择排序的方法对数组 a 中前 n 个元素/进行从小到大排序void InsertA();/采用插入排序的方法对数组 a 中前 n 个元素进行从小到大排序void PrintA(); /依次输出数组 a 中的前 n 个元素/最后输出一个换行;使用该类的主函数如下:void main()int a10=23,78,46,55,62,76
21、,90,25,38,42;AA x; _ _(1)_;int m=_(2)_;_(3)_;coutclass AA int a10;int n;public:void SetA(int aa, int nn); /用数组 aa 初始化数据成员 a,/用 nn 初始化数据成员 nint MaxA(); /从数组 a 中前 n 个元素中查找最大值void SortA(); /采用选择排序的方法对数组 a 中前 n 个元素/进行从小到大排序void PrintA(); /依次输出数组 a 中的前 n 个元素,/最后输出一个换行;使用该类的主函数如下:void main()int a10=23,78,
22、46,55,62,76,90,25,38,42;_ _(1)_; x.SetA(a,8);int _(2)_;_(3)_;x.PrintA();cout#includevoid main() char a510=“student“,“worker“,“soldier“,“cadre“,“peasant“;char s110, s210;strcpy(s1,a0); strcpy(s2,a0);for(int i=1;i0) strcpy(s1,ai);if(strcmp(ai, s2)#include class CD char* a;int b;public:void Init(char*
23、aa, int bb)a=new charstrlen(aa)+1;strcpy(a,aa);b=bb;char* Geta() return a;int Getb() return b;void Output() cout#include class CD char* a;int b;public:void Init(char* aa, int bb)a=new charstrlen(aa)+1;strcpy(a,aa);b=bb;char* Geta() return a;int Getb() return b;void Output() cout#includeclass A char
24、*a;public:A(char *s) a=new charstrlen(s)+1;strcpy(a,s);coutclass A int a;public:A(int aa=0): a(aa) coutdata=x; /3行p-next=NULL; /4行if(list=NULL) return p; /5行NODE *p1=list; /6行while(p1-next!=NULL) p1=p1-next; /7行,链表非空先找到表尾p1=p; /8行,让原表尾指针指向新添加的结点return list; 错误行的行号为_2_和_8_。分别改正为 NODE *p=new NODE;和_st
25、rcpy(p1,p)_ p1-next=p; _。 2、 假定要求下面程序输出结果为“d=800,f=60” ,在第 4-23行中存在着三条语句错误,请指出错误语句的行号并改正。#includeclass A /1行int a10; int n; /2行public: /3行A(int aa, int nn): n(nn) /4行for(int i=0; ims) coutms) cout=MS)return -1;2、int AA:Search(int x)int i;for(i=0; ims) coutx) x=ai;else;if(ai0)return 1;return 0;3、int
26、AA:Compare(AA b)if(n!=b.n) return 0;for(int i=0; ims) coutai= =b.ai)count+;if(this-n= =b.n)elsereturn 0;4、int AA:CompareBig(AA b)int k;if(nb.n) k=b.n; else k=n;for(int i=0; ib.ai) return 1;else if(aims) coutaib.ai)return 1;else if(this-aims) coutn=n; px-MS=MS;px-a=new intMS;for(int i=0; ian-1-i=ai;r
27、eturn px;7、根据下面类中 Reverse1 函数成员的原型和注释写出它的类外定义。class AA int* a;int n;int MS;public:void InitAA(int aa, int nn, int ms) if(nnms) cout“Error!“endl; exit(1);MS=ms;n=nn;a=new intMS;for(int i=0; iMS; i+) ai=aai;AA* Reverse1(); /通过动态存储分配得到一个对象,并动态分配/aMS数组空间,要求该对象中的 n 和 MS 的值与*this 中的/对应成员的值相同,数组元素的值是按照*thi
28、s 中数组元/素的相反次序排列得到的,要求该函数返回动态对象的地址。;int AA:* Reverse()AA c;c.n=*this.n;c.MS=*this.MS;*a=new int MS;for(int i=0;iMS/2;i+)c.ai=*this.MS-1-i;return 7、Array:Array(int aa, int nn) n=nn;a=new intn;for(int i=0; in; i+) ai=aai;8、根据下面类中构造函数的原型和注释写出它的类外定义。class Array int *a; /指向动态分配的整型数组空间int n; /记录数组长度public:
29、Array(int aa, int nn); /构造函数,利用 aa 数组长度 nn 初始化 n,/利用 aa 数组初始化 a 所指向的数组空间Array(Array /拷贝构造函数Array /实现 aa 赋值给*this 的功能并返回*thisArray Uion(Array /实现*this 和 aa 中的数组合并的/功能,把合并结果存入临时对象并返回int Lenth() return n; /返回数组长度void Print() /输出数组for(int i=0; in; i+)coutai ;coutendl;Array:Array(int aa, int nn):n(nn),a(
30、aa)8、Array:Array(Arraya=new intn;for(int i=0; in; i+) ai=aa.ai;9、根据下面类中拷贝构造函数的原型写出它的类外定义。class Array int *a; /指向动态分配的整型数组空间int n; /记录数组长度public:Array(int aa, int nn); /构造函数,利用 aa 数组长度 nn 初始化 n,/利用 aa 数组初始化 a 所指向的数组空间Array(Array /拷贝构造函数Array /实现 aa 赋值给*this 的功能并返回*thisArray Uion(Array /实现*this 和 aa 中
31、的数组合并的/功能,把合并结果存入临时对象并返回int Lenth() return n; /返回数组长度void Print() /输出数组for(int i=0; in; i+)coutai ;coutendl;Arrayreturn *this;9、Arrayn=aa.n;a=new intn;for(int i=0; in; i+) ai=aa.ai;return *this;10、根据下面类中 Give 函数的原型和注释写出它的类外定义。class Array int *a; /指向动态分配的整型数组空间int n; /记录数组长度public:Array(int aa, int nn); /构造函数,利用 aa 数组长度 nn 初始化 n,/利用 aa 数组初始化 a 所指向的数组空间Array(Array /拷贝构造函数Array /实现 aa 赋值给*this 的功能并返回*thisArray Uion(Array /实现*this 和 aa 中的数组合并的/功能,把合并结果存入临时对象并返回int Lenth() return n; /返回数组长度void Print() /输出数组for(int i=0; in; i+)coutai ;coutendl;Arrayreturn *this;10、