c 期末练习题 答案(打印)(1)(1)(2)
一、选择题
1. 有函数f定义如下: int f(int a = 1, int b = 2, int c = 3) { return a + b + c; }
下列说法中错误的是(D)。
A.函数调用f()的结果为6。 B.函数调用f(f(f()))的结果为16。 C.函数调用f(f(), f())的结果为15 D.函数调用f(f(), f(f()))的结果为21。 2. C++中,关于参数默认值的描述正确的是( B)。
A.只能在函数定义时设置参数默认值 B.设置参数默认值时,应当从右向左设置
C.设置参数默认值时,应当全部设置 D.设置参数默认值后,调用函数不能再对参数赋值 3. 如果类 A 被说明成类 B 的友元,则 (D )
A. 类A的成员即类 B 的成员 B. 类 B 的成员即类 A 的成员
C. 类A的成员函数不得访问类B的成员 D. 类 B 不一定是类 A 的友元 4、如下是某同学定义的类A,则其中有(B)处错误。 class A { int a = 1; void A(); ~A(void); } A.2 B.3 C.4 D.5 5、针对下列类型定义,可以出现在main函数中的语句有(A)。 class Date { private: int year, month, day; };
A.Date d; B.Date::year = 1; C.Date d = {2009, 1, 1}; D.cout << month; 6、有程序如下,下列说法中错误的是(B)。 class RMB { int yuan, jiao, fen; public: RMB(int y = 0, int j = 0, int f = 0) { yuan = y, jiao = j, fen = f; } ~RMB() {cout << yuan << \" :\" << jiao << \":\" << fen;} }; int main() { RMB a[2], b(10, 20, 30), c(b); }
A.20:10:30不可能是程序的输出结果。 B.析构对象c时输出结果是0:0:0。 C.0:0:0会在输出结果中出现两遍。 D.对象a[0]最后析构。 7、类A是自定义类型,下列说法中错误的是(C)。 A* a = new A; A* b = new A(a); delete a; delete b; A.构造堆对象a时会调用类A的默认构造函数。 B.构造堆对象b时会调用类A的拷贝构造函数。 C.堆对象a先构造,所以它后析构。 D.释放指针b所指内存时,会调用类A的析构函数。
8、a、b、c是类T的对象,为计算表达式c = a + b,必须(C )。
A.以成员函数形式重载加法运算符+。 B.以友元函数形式重载赋值运算符=。 C.以友元函数形式重载加法运算符+。 D.以T作为加法运算符函数的返回类型。 9.执行如下的程序段后,输出结果是(A )。
cout.fill('*'); cout.width(6); cout.fill('#'); cout << 123 << endl; A.###123 B.123### C.***123 D.123***
10.s是STL数据类型string的对象,下列表达式错误的是(C)。
A.s += 's' B.s = \"Hello\" C.s - 'a' D.s > \"abc\" 11.下列程序中,访问出错的是(B)。 class A { private: int x; protected: int y() {x = 1;} // A public: int z; }; class B : public A { public: void u() {cout << x;} // B }; int main() { B b; b.z = 1; // C b.u(); // D }
12.有类型定义如下,则下列说法中错误的是(B)。 class Object {}; class A {Object oa;}; class B : public A {Object ob;};
A.构造类B的对象时会首先调用类Object的构造函数。 B.对语句B b;的执行会先后引发6次函数调用。
C.析构类B的对象时,类B的析构函数在类A的析构函数之前调用。 D.析构类A的对象时会最后调用类Object的析构函数。
13.在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是 (A)
A. 派生类的对象可以直接访问基类中的成员 B. 派生类的对象可以初始化基类的引用 C. 派生类的对象可以赋给基类的对象 D. 派生类的对象的地址可以赋给指向基类的指针 14.下列( D)行的输出结果是B::v。 class A { public: void f() {cout << \"A::f\" << endl;} virtual void v() {cout << \"A::v\" << endl;} }; class B : public A { public: void f() {cout << \"B::f\" << endl;} virtual void v() {cout << \"B::v\" << endl;} }; int main() { A a, *pa = &a; pa->f(); // A pa->v(); // B B b; pa = &b; pa->f(); // C
pa->v(); // D }
15.以下(C )成员函数表示纯虚函数。
A.virtual int vf(int); B.void vf(int)=0; C.virtual void vf()=0; D.virtual void vf(int){}
17.下列程序段中,ofs是ofstream类的对象,ifs是ifstream类的对象,c是char型变量,则执行结果是(B)。 while (ifs.get(c)) ofs.put(c);
A.把一个文件的第1个字节写入到另一个文件中 B.把一个文件的内容全部写入到另一个文件 C.仅仅把字符c写入到一个文件中 D.把两个文件的内容合并到一起
4. 下面说法正确的是 (B)
A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方 B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C.类的内联函数必须在类体内定义 D.类的内联函数必须在类体外通过加关键字 inline 定义 18.下列(B)循环能够把26个小写字母以文本方式写入文件中。 int main() { int a; ofstream ofs(\"data.txt\"); a = 'a'; while (a <= 'z') ofs << a++; // A a = 'a'; while (a <= 'z') ofs.put(a++); // B a = 'a'; while (a <= 'z') { // C ofs.write((const char*)&a, sizeof(a)); ++a; } a = 'a'; while (a <= 'z') cout << char(a++); // D ofs.close(); }
19.假定AB为一个类,则执行“AB a(4), b[5], *p[2];”语句时,自动调用该类构造函数的次数为( A )。 A. 6 B. 7 C. 9 D. 11 20.下面叙述错误的是( A)。
A. 基类的protected成员在派生类中仍然是protected
B. 基类的protected成员在public派生类中仍然是protected的 C. 基类的protected成员在private派生类中是private的 D. 基类的protected成员不能被派生类的对象访问 21. 多继承派生类构造函数构造对象时,( B)被最先调用。 A. 派生类自己的构造函数 B. 虚基类的构造函数
C. 非虚基类的构造函数 D. 派生类中子对象类的构造函数 22.关键字 _____C__ 说明对象或变量初始化后不会被修改。
A. static B. public C. const D. inline 23.在C++中,函数原型不能标识( D)
A.函数的返回类型 B.函数参数的个数 C.函数参数类型 D.函数的功能 24.以下能正确定义数组并正确赋初值的语句是D
A. int N=5,b[N][N]; B. int a[2]={{1},{3},{4},{5}}; C. int c[2][]={{1,2},{3,4}}; D. int d[3][2]={{1,2},{3,4}}; 25.对于动态分配内存空间描述正确的是( D )
A.使用new运算符分配的内存空间的长度必需是常量 B.delete运算符可以释放动态的存储空间和静态的存储空间 C.由new分配的内存空间是不连续的
D.delete运算符只能释放由new分配的动态存储空间
26.C++中解决命名冲突的机制是:D
A.虚基类 B.虚函数 C.函数重载 D.名字空间 27.对于一个功能不太复杂,并且要求加快执行速度,选用(A )合适。
A.内联函数 B.重载函数 C.递归调用 D.嵌套调用 28.在一个源文件中定义的全局变量的作用域为( C ) A. 本程序的全部范围 B. 本函数的全部范围
C. 从定义该变量的位置开始到本文件结束 D. 以上说法都不正确 5.对于任意一个类,析构函数的个数最多为(B )
A.0 B.1 C.2 D.3
29. 假定 AB 为一个类,则执行 AB x ;语句时将自动调用该类的 (B )
A. 有参构造函数 B. 无参构造函数 C. 拷贝构造函数 D. 赋值构造函数 30. 类型修饰符 unsigned 不能修饰 (D )
A. char B. int C. long int D. float 31.可以用 p.a 的形式访问派生类对象 p 的基类成员 a ,其中 a 是 (D)
A.私有继承的公有成员 B.公有继承的私有成员 C.公有继承的保护成员 D.公有继承的公有成员 32.下列程序的输出结果是(B) void f(int& i, int& j) { int t(i); i = j, j = t; cout << i << \"\\" << j << \"\\"; } int main() { int a = 5, b = 8; f(b, a); cout << a << \"\\" << b << endl; }
A.8 5 5 8 B.5 8 8 5 C.5 8 5 8 D.8 5 8 5 33.对于类定义 class A{
public:
virtual void func1( ){ } void func2( ){ } };
class B:public A{ public:
void func1( ){cout<<〃class B func 1〃< A. A::func2( )和B::func1( )都是虚函数 B. A::func2( )和B::func1( )都不是虚函数 C. B::func1( )是虚函数,而A::func2( )不是虚函数 D. B::func1( )不是虚函数,而A::func2( )是虚函数 34.在下列函数原型中,可以作为类AA构造函数的是( D )。 A.void AA(int); B.int AA(); C.AA(int)const; D.AA(int); 35. 将两个字符串连接起来组成一个字符串时,选用( C)函数。 A. strlen() B. strcap() C. strcat() D. strcmp() 36. 如果类 A 被说明成类 B 的友元,则 ( D) A. 类A的成员即类 B 的成员 B. 类 B 的成员即类 A 的成员 C. 类A的成员函数不得访问类B的成员 D. 类 B 不一定是类 A 的友元 37. 用new运算符创建一个含10个元素的一维整型数组的正确语句是(C )。 A. int *p=new a[10]; B. int *p=new float[10]; C. int *p=new int[10]; D. int *p=new int[10]={1,2,3,4,5} 38. 在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是 (C ) A. 派生类的对象可以赋给基类的对象 B. 派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 40.面向对象方法的多态性是指(B)。 A. 一个类可以派生出多个特殊类 B. 一个对象在不同的运行环境中可以有不同的变体 C. 针对一消息,不同的对象可以以适合自身的方式加以响应 D. 一个对象可以是由多个其他对象组合而成的 41. 在 C++ 程序中,对象之间的相互通信通过 (B) A. 继承实现 B. 调用成员函数实现 C. 封装实现 D. 函数重载实现 42.面向对象软件开发中使用的OOA表示( A)。 A. 面向对象分析 B. 面向对象设计 C. 面向对象语言 D. 面向对象方法 43.在 int a=3,int *p=&a ;中, *p 的值是 (D ) A. 变量 a 的地址值 B. 无意义 C. 变量 p 的地址值 D.3 44.使用重载函数编程序的目的是(A) A. 使用相同的函数名调用功能相似的函数 B. 共享程序代码 C. 提高程序的运行速度 D.节省存储空间 45. 在多文件结构的程序中,通常把类的定义单独存放于(D)中。 A. 主文件 B. 实现文件 C. 库文件 D. 头文件 46.可以用 p.a 的形式访问派生类对象 p 的基类成员 a ,其中 a 是 ( D) A. 私有继承的公有成员 B. 公有继承的私有成员 C. 公有继承的保护成员 D. 公有继承的公有成员 47.C++语言中函数返回值的类型是由( C )决定的? A. return语句中的表达式类型 B. 调用该函数的主调函数类型 C. 定义函数时所指定的函数类型 D. 上说法都不正确 48.当将一个类A或函数f()说明为另一个类B的友元后,类A或函数f()能够直接访问类B的(D )。 A. 只能是公有成员 B. 只能是保护成员 C. 只能是除私有成员之外的任何成员 D. 具有任何权限的成员 49.下正确的函数原型为(D) A. func (int x ; int y); B. void (x , y); C.void (int x , y); D. void func (int , int); 50.在一个源文件中定义的全局变量的作用域为( C ) A. 本程序的全部范围 B. 本函数的全部范围 C. 从定义该变量的位置开始到本文件结束 D. 以上说法都不正确 51.应在下列程序划线处填入的正确语句是( C )。 class Base { public: void fun(){cout<<\"Base::fun\"< cout<<\"Derived::fun\"< 52.C++中,关于参数默认值的描述正确的是(A )。 A.只能在函数定义时设置参数默认值 B.设置参数默认值时,应当从右向左设置 C.设置参数默认值时,应当全部设置 D.设置参数默认值后,调用函数不能再对参数赋值 53.如果表达式a+b中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为(A )。 A. a.operator+(b) B. b.operator+(a) C. operator+(a,b) D. operator(a+b) 54.实现运行时的多态性要使用( D )。 A.重载函数 B.构造函数 C.析构函数 D.虚函数 55.对数组名作函数的参数,下面描述正确的是(B )。 A.数组名作函数的参数,调用时将实参数组复制给形参数组。 B.数组名作函数的参数,主调函数和被调函数共用一段存储单元。 C.数组名作参数时,形参定义的数组长度不能省略。 D.数组名作参数,不能改变主调函数中的数据。 56.对于一个功能不太复杂,并且要求加快执行速度,选用(A )合适。 A.内联函数 B.重载函数 C.递归调用 D.嵌套调用 58.C++中的虚基类机制可以保证:( D)。 A. 限定基类只通过一条路径派生出派生类 B. 允许基类通过多条路径派生出派生类,派生类也就能多次继承该基类 C. 当一个类多次间接从基类派生以后,派生类对象能保留多份间接基类的成员 D. 当一个类多次间接从基类派生以后,其基类只被一次继承 59.用重载函数编程序的目的是(A ) A.使用相同的函数名调用功能相似的函数 B. 共享程序代码 C. 提高程序的运行速度 D. 节省存储空间 60. 在 C++ 程序中,对象之间的相互通信通过 (B ) A.继承实现 B.调用成员函数实现 C. 封装实现 D. 函数重载实现 61、下列关于C++标识符的命名不合法的是C A. Pad B. name_1 C. A#bc D. _a12 62、若有以下类型标识符定义: (D) int x=2; char w='a'; float y=23.45f; double z=45.6712; 则表达式w*x+y-z的结果类型是 A. float B. char C. Int D. double 63、若有int x=10,y=20,z=30; 则执行下面语句后,x的值是B if(x>y) z=x; x=y; y=z; A. 10 B. 20 C. 30 D. 0 64、循环语句whlie(int i=0 )i--;的循环次数是A A. 0 B. 1 C. 5 D. 无限 65、一个函数无返回值时,应选择的说明符是C A. static B. extern C. void D. 无说明符 66、对重载函数形参的描述中,错误的是D A. 参数的个数可能不同 B. 参数的类型可能不同 C. 参数的顺序可能不同 D. 参数的个数、类型、顺序都相同,只是函数的返回值类型不同 67、以下能正确定义数组并正确赋初值的语句是D A. int N=5,b[N][N]; B. int a[2]={{1},{3},{4},{5}}; C. int c[2][]={{1,2},{3,4}}; D. int d[3][2]={{1,2},{3,4}}; 68、下列给字符数组进行的初始化中,不正确的是D A. char s1[]=\"abcd\"; B. char s2[3]={'x','y','\\0'}; C. char s3[]={'a','x','y','\\0'}; D. char s4[6]={\"xyz\ 69、通常的拷贝构造函数的参数是C A. 某个对象名 B.某个对象成员名 C. 某个对象的引用 D.某个对象的指针名 70、关于构造函数特点的描述中,错误的是A A. 定义构造函数必须指出类型 B. 构造函数的名字与该类的类名相同 C. 一个类中可定义0至多个构造函数 D. 构造函数是一种成员函数 71、下面程序的运行结果为 D +using namespace std;后选C #include extern int x,y; cout< int s=a+b; return s; } A.20 B.5 C.25 D.编译会提示出错信息 72、关于常成员的描述中,错误的是B A. 常成员包含常数据成员和常成员函数两种 B. 常数据成员必须是公有的 C. 常数据成员要使用构造函数成员初始化列表进行初始化 D. 常对象只能调用它的常成员函数,不能调用其它的成员函数 73、关于友元函数的描述中,错误的是B A. 友元函数不是成员函数 B. 友元函数只能访问类中私有成员 C. 友元函数破坏隐藏性,尽量少用 D. 友元函数说明在类体内,使用关键字friend 74、如果有int x,*p; float y,*q;则下面操作正确的是C A.p=x B.p=q C.p=&x D.p=&y 75、若有函数说明void fA(int m, int n); 和指针变量的定义 void (*p)(int,int);并且有p= fA则下列操作不正确的是D A.(*p)(3,4); B.p(3,4); C.fA(3,4); D.*p++; 76、若数组名作实参而指针变量作形参,函数调用时实参传给形参的是D A. 数组的长度 B. 数组第一个元素的值 C. 数组所有元素的值 D. 数组第一个元素的地址 77、对于动态分配内存空间描述正确的是D A.使用new运算符分配的内存空间的长度必需是常量 B.delete运算符可以释放动态的存储空间和静态的存储空间 C.由new分配的内存空间是不连续的 D.delete运算符只能释放由new分配的动态存储空间 78、能够释放对象所占资源的是 ( A) A.析构函数 B.数据成员 C.构造函数 D.静态成员函数 79、虚函数的定义是在基类中进行的,定义时需要冠以关键字C A.static B.frend C.virtual D.public 80、在C++中串流类是在头文件strstrea.h中定义的,下列不属于串流类的是 (C) A.strstream B.ostrstream C.ofstream D.Istrstream 二、填空题 1. “面向对象”程序设计的三大基本特性是封装性、继承性、多态性。 2、C++支持两种多态性: 编译 时的多态性和_运行时_时的多态性。 3.在函数体之后加 __const__ 关键字可以防止覆盖函数改变数据成员的值。 4、对于类中定义的任何成员,其隐含访问权限为____private____。 5、 若只需要通过一个成员函数读取数据成员的值,而不需要修改它,则应在函数头的后面 加上_const___关键字。 6. 如果new返回的指针丢失,则所分配的堆空间无法收回,称为 _内存泄漏__ 。 7、在继承机制下,当对象消亡时,编译系统先执行 子类 的析构函数,然后才执行 派生类 的析构函数,最后执行 基类 的析构函数。 8、 假定用户为类AB定义了一个构造函数“AB(int aa):a(aa){}”,则_a__是该类的数据成员。 9. 假定用户没有给一个名为 car 的类定义析构函数,则系统自动给出的缺省析构函数定义 为 ____car::car(){}____ 。 10. 访问一个指针所指向的对象的成员所用的运算符是 __->_____ 。 11、已知有定义“int x, a[]={5,7,9}, *pa=a;”,在执行“x=++*pa;”语句后,x的值是__6____,*(pa+1)的值为___7___。 12.若希望用一个已有对象来构造另一个同类型的对象,可以使用 拷贝构造函数 来实现。 13、假定AB为一个类,则类定义体中的“AB(AB& x);”语句为该类___拷贝构造函数___的原型语句,而“operator=(AB& x);”为该类___赋值重载函数____的原型语句。 14、为了访问某个类的私有数据成员,必须在该类中声明该类的 友元 。 15、静态成员是局部于类的成员,它提供一种同类对象的__共享 ___机制。 17. 面向对象程序设计有四个主要特点,即抽象、封装、_继承__和_多态 __。 18.在用class定义一个类时,数据成员和成员函数的默认访问权限是_private____。 19.在函数体之后加 _const__ 关键字可以防止覆盖函数改变数据成员的值。 20.私有数据通常由公有成员函数来访问(读和写)。这些函数统称为__操作___。 21.在字长为32位的机器中,sizeof(float)= 4 字节,sizeof(double)= 8 字节 22.引用通常用作函数的参数和__引用变量__。 23. 如果new返回的指针丢失,则所分配的堆空间无法收回,称为 _____内存泄漏_ 。 24. C++中多态性包括两种多态性:__编译____时的多态性和____运行____时的多态性。 25. 若有char a[80];则cin>>a表示从键盘上读入一个__字符串__ 到数组a中。 26.静态数据成员是类的所有对象中共享 的成员,静态数据成员初始化与一般数据成员初始化不同。 27. C++流类库定义的cin,cout,cerr和clog是__全局流对象___ 。 29. 假定用户没有给一个名为 shape 的类定义析构函数,则系统自动给出的缺省析构函数定义 为 ____shap::~shap(){}______ 。 30._构造函数__是特殊的成员函数,在创建和初始化对象时调用。 31.运算符重载的作用是使运算符可以操作自定义的_类_,但重载后运算符原有的 操作_不变。 32.派生类不能访问基类的_私有_成员,但可以访问基类的公有成员和_保护_成员。 33.具有__纯虚拟函数_的类称为抽象类。 三、判断题 1.( F)基类中被说明为protected和private的成员只能被其派生类的成员函数访问,不能被其它的函数访问。 2.(F)break语句也可以用于if体内,它可退出if语句。 3.( F) 类的静态数据成员需要在定义每个类的对象时进行初始化。 4.(F)友元函数说明在类体内,它是一种成员函数。 5.(F)在传值调用中,要求实参和形参的类型完全一致并且个数相等。 6.(T) 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。 7.(F)异常必须在其产生的当前函数中捕获,而不能在外层函数中捕获该异常。 8.(T) 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。 9.( F) 类的静态数据成员需要在定义每个类的对象时进行初始化。 10.( T)程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来 的编译工作量。 11.( T)重载函数必须有不同的参数列表。 12.( T)类B从类A公有继承,则程序段A a;B &b=a;会引发编译错误。 13.(T)拷贝构造函数用于用类的一个对象去初始化该类的另一个对象时使用,也可已用于当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。 14.(T)类中所提供的成员函数可以直接访问私有成员。 15. ( T ) int i,*p=&i;是正确的C说明。 16.( F)析构函数不能被继承。 17.(F)一个类只有一个构造函数, 但可以有多个析构函数。 18.( F)引用和指针都可作函数参数。 19.( F)对于任意正确定义的类,都可以构造出该类型的对象。 20.( T) 若要实例化一个含有引用型数据成员的类,那么只能使用构造函数初始化列表来初始化该数据成员。 (1) 下列关于构造函数说法不正确的是( C ) A)构造函数必须与类同名 B)构造函数可以省略不写 C)构造函数必须有返回值 D)在构造函数中可以对类中的成员进行初始化 (2)下列关于模板的说法正确的是( D ) A)模板的实参在任何时候都可以省略 B)类模板与模板类所指的是同一概念 C)类模板的参数必须是虚拟类型的 D)类模板中的成员函数全部都是模板函数 (3)一个类的友元函数能够访问该类的( D ) A)私有成员 B)保护成员 C)公有成员 D)所有成员 (4) 下面选项中不属于面向对象程序设计特征的是( C )。 A)继承性 B)多态性 C)类比性 D)封装性 (5) 下列关于类定义的说法中,正确的是( A ) A)类定义中包括数据成员和成员函数的声明 B)类成员的缺省访问权限是保护的 C)数据成员必须被声明为私有的 D)成员函数只能在类体外进行定义 (6) 下列关于派生类构造函数和析构函数的说法中,错误的是( D ) A)派生类的构造函数会隐含调用基类的构造函数 B)如果基类中没有缺省构造函数,那么派生类必须定义构造函数 C)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数 D)在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数 (7) 通过运算符重载,可以改变运算符原有的( A ) A)操作数类型 B)操作数个数 C)优先级 D)结合性 (8) 有如下函数模板: template T souare(T x) { return * x ; } 基中T是( C ) A)函数形参 B)函数实参 C)模板形参 D)模板实参 (9) 下列字符串中,不可以用作C++标识符的是( D ) A)y_2006 B)___TEST__H C)Return D)switch (10) 下列有关继承和派生的叙述中,正确的是( C ) A)派生类不能访问基类的保护成员 B)作为虚基类的类不能被实例化 C)派生类应当向基类的构造函数传递参数 D)虚函数必须在派生类中重新实现 (11) 下列运算符中,不能被重载的是( C ) A)&& B) != C) . D)++ (12)下列关于C++函数的说明中,正确的是( D ); A.内联函数就是定义在另一个函数体内部的函数 B.函数体的最后一条语句必须是return语句 C.标准C++要求在调用一个函数之前,必须先声明其原型 D.编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式 (13) 下列关于虚函数的说明中,正确的是( B ) A.从虚基类继承的函数都是虚函数; B.虚函数不得是静态成员函数; C.只能通过指针或引用调用虚函数 D.抽象类中的成员函数都是虚函数; (14) 模板对类型的参数化提供了很好的支持,因此( B ); A.类模板的主要作用是生成抽象类; B.类模板实例化时,编译器将根据给出的模板实参生成一个类; C.在类模板中的数据成员都具有同样类型; D.类模板中的成员函数都没有返回值; (15)下列符号中可以用作C++标识符的是( A ); A._radius B.foo~bar(因为有特殊符号) C.else(因为是关键字) D.3room(因为开头是数字) (16) 下列叙述中,错误的是( D ) A. 父类不能替代子类 B. 子类能够替代父类 C. 子类继承父类 D. 父类包含子类 (17) 下列关于C++函数的叙述中,正确的是( C ) A)每个函数至少要具有一个参数 B)每个函数都必须返回一个值 C)函数可以没有返回值 D)函数不能自己调用自己 (18) 下面语句正确的是( C ) A) void &ra = 4; B) int &rx; C) int x,y;int &rx = y; D) int a[10]; int &ra = a; (19)下列关于类和对象的叙述中,错误的是( A ) A)一个类只能有一个对象 B)对象是类的具体实例 C)类是对某一类对象的抽象 D)类和对象的关系是一种数据类型与变量的关系 (20) 在C++中,用于实现运行时多态性的是( D ) A)内联函数 B)重载函数 C)模板函数 D)虚函数 (21) 下列关于运算符重载的叙述中,正确的是( B ) A)通过运算符重载,可以定义新的运算符 B)有的运算符只能作为成员函数重载 C)若重载运算符+,则相应的运算符函数名是+ D)重载一个二元运算符时,必须声明两个形参 (22) 下列关于模板的叙述中,错误的是( C ) A)模板声明中的第一个符号总是关键字template B)在模板声明中用 < 和 > 括起来的部分是模板的形参表 C)类模板不能有数据成员 D)在一定条件下函数模板的实参可以省略 (23)下面关于C++语言的描述错误的是( B ) A.C++语言支持数据封装 B.C++语言中引入友元没有破坏封装性 C.C++语言允许函数名和运算符重载 D.C++语言支持动态联编 (24)一个函数功能不太复杂但要求被频繁调用,应选用( A ) A.内联函数 B.重载函数 C.递归函数 D.嵌套函数 (25)为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为( A ) A.public B.protected C.private D.static (26)在C++语言程序中,对象之间的相互通信通过( B ) A.继承实现 B.调用成员函数实现 C.封装实现 D.函数重载实现 (27)类的析构函数是在什么时候调用的( C ) A.类创建时 B.创建对象时 C.删除对象时 D.不自动调用 (28)通常拷贝构造函数的参数是( C ) A.某个对象名 B.某个对象的成员名 C.某个对象的引用名 D.某个对象的指针名 (29)下列不是描述类的成员函数的是( C ) A.构造函数 B.析构函数 C.友元函数 D.拷贝构造函数 (30)继承机制的作用是( C ) A.信息隐藏 B.数据封装 C.定义新类 D.数据抽象 (31)在C++语言类体系中,不能被派生类继承的有( B ) A.转换函数 B.构造函数 C.虚函数 D.静态成员函数 (32)下列哪个选项是合法的标识符?( B ) A.123 B._name C.class D.1first (33)对类的构造函数和析构函数描述正确的是( A ) A)构造函数可以重载,析构函数不能重载 B)构造函数不能重载,析构函数可以重载 C)构造函数可以重载,析构函数也可以重载 D)构造函数不能重载,析构函数也不能重载 (34)如果类A被说明成类B的友元,则( D ) A) 类A的成员即类B的成员 B) 类B的成员即类A的成员 C) 类A的成员函数不得访问类B的成员 D) 类B不一定是类A的友元 (35)下面关于虚函数的描述,错误的是( B ) A)在成员函数声明的前面加上virtual修饰,就可把该函数声明为虚函数 B)基类中说明了虚函数后,派生类中对应的函数也必须说明为虚函数 C)虚函数可以是另一个类的友元函数,但不能是静态成员函数 D)基类中说明的纯虚函数在其任何派生类中都必须实现 (36)下面给数组赋初值语句中,( C )是错误的。 A) int a[]={1,2,3,4,5}; B) int b[5]={1,3,5}; C) int c[3]={1,3,5,7}; D) int d[]={3,5,6,7}; 1、派生类的构造函数的成员初始化列中,不能包含( c )。 A基类的构造函数; B派生类中子对象的初始化; C基类的子对象的初始化; D派生类中一般数据成员的初始化。 2、面向对象程序设计思想的主要特征不包括( B ) A) 继承性 B功能分解,逐步求精 C封装性和信息隐藏 D多态性 3、面向对象程序设计中,( B )为程序的组成单元。 A) 语句 B类 C主函数 D子函数 4、假设已经有定义char * const name=”chen”;下面的语句中正确的是 ( D ) A) name[3]=’q’; Bname=”lin”; Cname= new char[5]; Dcout< A) return 语句中的表达式类型 B定义该函数时所指定的函数类型 C调用该函数时的主调用函数类型 D调用函数时系统临时 7、在派生类中重新定义虚函数时,除了( D )方面,其他方面都必须与基类中相应的虚函数保持一致。 A) 参数个数 B参数类型 C函数名称 D函数体 5.有关运算符重载正确的描述是:( D )。 A.C++语言允许在重载运算符时改变运算符的操作个数 B.C++语言允许在重载运算符时改变运算符的优先级 C.C++语言允许在重载运算符时改变运算符的结合性 D.C++语言允许在重载运算符时改变运算符的原来的功能 6.若MyClass为一个类,执行“MyClass a[3],*p[4];”语句时会自动调用该类构造函数的次数是( B )。 A.4 B.3 C.2 D.7 7.对new运算符的下列描述中,( B )是错误的。 A.它可以动态创建对象和对象数组 B.用它创建对象数组时必须指定初始值 C.用它创建对象时要调用构造函数 D.用它创建的对象可以使用运算符delete来释放 8.在类外不能访问类私有成员属于类的( A )特征。 A.封装 B.继承 C.多态 D.抽象 8、+namespace与class、struct、union和enum有着明显的区别,下面说法错误的是( C ) A) namespace只能在全局范围内定义,但它们之间可以互相嵌套 B) 在namespace定义的结尾,右花扩号的后面不必跟一个分号 C) 一个namespace可以在多个头文件中用一个标识符来定义,就好像重复定义一个类一样 D) namespace可以把全局名字空间当成一个小空间来管理 9、在C++语言中,数据封装要解决的问题是( C ) A) 避免数据丢失 B数据的规范化 C防止不同模块之间数据的非法访问 D 便于数据转换 10、 已知print()函数是一个类的常量成员函数,它无返回值,下列表示中( A )是正确的。 A) void print() const Bconst void print() Cvoid const print() D void print(const) 11、 以下正确的函数原型为( D ) A) func (int x ; int y); Bvoid (x , y); Cvoid (int x , y); Dvoid func (int , int); 12、 为了避免在嵌套的条件语句if-else中产生二义性,C++规定:else子句总是与( B )配对。 A) 缩排位置相同的if B和其之前最近if C和其之后最近if D同一行上的if 13、 对于一个功能不太复杂,并且要求加快执行速度,选用( A )合适。 A) 内联函数 B重载函数 C递归调用 D嵌套调用 14、 编译时的多态性可以通过使用( C )获得。 A) 虚函数和指针 B重载函数和析构函数 C虚函数和对象 D虚函数和引用 9.类O定义了公有函数F1。P和Q为O的派生类,定义为class P:protected O{…};class Q: public O{…}。则可以访问F1的是( A )。 A. O、P、Q类的对象 B. P、Q类的对象 C. O、Q类的对象 D. O类的对象 10.A类定义如下,编译时有错误的行是( B )。 class A{ int a; //1行 public: ~A(int); //2行 A(); //3行 A(int); //4行 }; A. 1 B. 2 C. 3 D. 4 12.要实现动态联编,必须通过( A )调用虚函数。 A.对象指针 B.成员名限定 C.对象名 15、 下面对于友元函数描述正确的是 ( C )。 A) 友元函数的实现必须在类的内部定义 B友元函数是类的成员函数 C友元函数破坏了类的封装性和隐藏性 D友元函数不能访问类的私有成员 D.派生类名 16、 设有如下定义int (*ptr)();,下面关于ptr正确叙述是( C )。 A) ptr是指向一维数组的指针变量。 Bptr是指向int 型数据的指针变量。 C ptr是指向函数的指针,该函数返回一个int型数据。 D ptr是一个函数名,该函数的返回值是指向int型数据的指针。 17、 使用重载函数编程序的目的是( A ) A) 使用相同的函数名调用功能相似的函数 B共享程序代码 C提高程序的运行速度 D节省存储空间 18在派生类中重新定义虚函数时,除了(D)方面,其他方面都必须与基类中相应的虚函数保持一致。 A) 参数个数 B参数类型 C函数名称 D函数体 13.有如下函数模板定义: template T func(T x, T y) { return x*x+y*y; } 在下列对func的调用中,错误的是( C )。 A.func(5, 11); B.func(3.6, 5.8); C.func(4, 9.4); 18、 构造函数是在( B )时被执行的 A) 程序编译 B创建对象 C创建类 D程序装入内存 19、 如果在基类中将show声明为不带返回值的纯虚函数,正确的写法是:( C ) A) virtual show()=0; Bvirtual void show(); Cvirtual void show()=0; Dvoid show()=0 virtual; 20、 下列函数模板定义中,不合法的是( C ) A) template Template A.方法 B.多态性 C.属性 D.消息 D.func(‘b’,‘c’); 15.UML中逻辑视图的作用是——( C )。 A.描述系统的功能需求,找出用例和执行者 B.描述如何实现系统内部的功能 C.描述系统代码构件组织和实现模块,及它们之间的依赖关系 D.描述系统的并发性,并处理这些线程间的通信和同步 21、 在下面有关析构函数特征的描述中,正确的是:( C ) A) 一个类中可以定义多个析构函数 B析构函数名与类名完全相同 C析构函数不能指定返回类型 D析构函数可以有一个或多个参数 22、 使用派生类的主要原因是:( A ) A) 提高代码的可重用性 B提高程序的运行效 C加强类的封装性 D实现数据的隐藏 23、 有关运算符重载正确的描述是:( D ) A) C++语言允许在重载运算符时改变运算符的操作个数 B) C++语言允许在重载运算符时改变运算符的优先级 C) C++语言允许在重载运算符时改变运算符的结合性 D) C++语言允许在重载运算符时改变运算符的原来的功能 4、对于一个功能不太复杂,并且要求加快执行速度,选用( A )合适。 A)内联函数 B)重载函数 C)递归调用 D)嵌套调用 5、运行时的多态性可以通过使用( C )获得。 A) 虚基类 B) 重载函数 C) 虚函数 D) 引用基类 D) 实现多态性 6、模板的使用是为了:( A ) A) 提高代码的可重用性 B) 提高代码的运行效率 C) 加强类的封装性 7、+下列关于this指针的叙述中,错误的是( A ) A) 类的成员函数都有this指针 Bthis隐含于每个类的非静态成员函数中 C)this指针是成员函数所属对象的指针 24、 模板的使用是为了:( A ) A) 提高代码的可重用性 B提高代码的运行效率 C加强类的封装性 D实现多态性 25、 以下有关静态数据成员函数的叙述不正确的是( B ) A) 静态成员函数属于整个类 B对静态成员函数的引用不允许使用对象名 C在静态成员函数中不能直接引用类的非静态成员 D使用类名可以直接调用其静态成员函数 12、以下( D )成员函数表示纯虚函数。 A)virtual int vf(int); B)void vf(int)=0; C)virtual void vf(int){} D) virtual void vf()=0; 13、在表达式 x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。则operator+有 个参数,operator*有 参数。( C ) A) 1、2 B)2、1 C) 2、2 D)1、1 14、在下列函数原型中,可以作为类AA构造函数的是( D )。 A)void AA(int); B)int AA(); C)AA(int)const; D)AA(int); 15、可以用p.a的形式访问派生类对象p的基类成员a,其中a是( D ) A)私有继承的公有成员 B)公有继承的私有成员 C)公有继承的保护成员 D)公有继承的公有成员 26、 对new运算符的下列描述中,( B )是错误的。 A) 它可以动态创建对象和对象数组 B用它创建对象数组时必须指定初始值 C用它创建对象时要调用构造函数 D用它创建的对象可以使用运算符delete来释放 27、 下列有关类的说法不正确的是( C )。 A) 对象是类的一个实例 B任何一个对象只能属于一个具体的类 C一个类只能有一个对象 D类与对象的关系和数据类型与变量的关系相似 (1) 在C++中封装性、继承性和多态性是面向对象思想的主要特征。 (2) 派生类构造函数的执行顺序是先执行基类的构造函数.然后执行成员对象的构造函数,最后执行派生类的构造函数。 (3) 在面向对象方法中,类描述的是具有相似属性与操作的一组对象。 (4) 用来派生新类的称为父类,而派生出的新类称为它的子类或派生类。 (5) 在面向对象方法中,类之间共享属性和操作的机制称为继承。 (6) 一个消息包含以下信息:发送者、接受者、要求服务、输入信息、输出信息。 (7) 对于一个类的数据成员和成员函数的访问方式主要有三种:外部、内部、对象。 (8) 析构函数的主要功能是:释放动态内存的分配。 判断题 1、构造函数和析构函数(不能重载)都可以重载。× 2、参数传递有值传递和地址传递两种方式。√ 3、可以对C++所有运算符进行重载。× 4、类模板不是类,但模板类是类。√ 5、类的数据成员不允许是另一个类的对象。× 6、派生类中不可以定义与其基类中同名的成员变量。× 1. 构造函数、析构函数、友元函数都属于类的成员函数。0 2. 静态数据成员是类的所有对象共享的数据。1 3. 可以将派生类对象的值赋给基类对象,也可以将基类对象的值赋给派生类对象。0 4. 派生类默认的继承方式为public。0 5. 类模板实例化的过程是类模板->模板类->对象。1 6. 在公有继承中,基类中只有公有成员对派生类是可见的。0 7. 在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。0 8. 虚基类是用来解决多继承中公共基类在派生类中只产生一个基类子对.? 9. 类模板实例化的过程是类模板->模板类->对象。1 10. 重载双目运算符为成员函数时,一般将左操作数作为函数的参数。? 11. 可以将插入运算符”<<”和提取运算符”>>” 重载为类的成员函数。0 12. 类模板实例化的过程是类模板->模板类->对象。1 13. 派生类是从基类派生出来,它不能生成新的派生类。0 14. 多继承情况下,派生类的构造函数的执行顺序取决于定义派生类时所指定的各基类的顺序。1 15. 构造函数可以重载,析构函数也可以重载。0 16. 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数 自动继承基类中虚函数的特性。1 17. 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,当对一个 对象调用成员函数时,编译程序先将对象的地址赋值给this指针后,再调用成员函数。? 18. 对象是属性和行为的集合。1 19. 模板的使用是为了加强类的封装性。0 20. 函数定义时在函数参数表后加=0表示该函数为纯虚函数。0 21. 对象是属性和行为的集合。1 22. 设A为类,则A类的复制构造函数原型声明为void A(A&)。0 23. 可以以”类名:: 静态成员函数(实参表)”和” 对象.静态成员函数(实参表)”两种形式调用类的静 态成员函数。1 24. 语句int a(5), *p; *p=a; 能够正常执行。0 25. 这个函数自动继承基类中虚函数的特性。? 26. 设A为类,则A类的复制构造函数原型声明为void A(A&)。0 27. 可以将派生类对象的值赋给基类对象,也可以将基类对象的值赋给派生类对象。0 28. 设A为类,则A *(*fpA[5])()的正确描述是:fpA是一个数组,数组的5个元素都是A类对象。? 29. 派生类默认的继承方式为public。0 30. 函数定义时在函数参数表后加=0表示该函数为纯虚函数。0 31. C++语言中,既允许单继承,又允许多继承。1 32. 派生类是从基类派生出来,它不能生成新的派生类。0 33. 派生类的继承方式有两种:公有继承和私有继承。0 34. 在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。0 35. 在公有继承中,基类中只有公有成员对派生类是可见的。0 36. 在私有继承中,基类中只有公有成员对派生类是可见的。0 37. 在私有继承中,基类中所有成员对派生类的对象都是不可见的。1 38. 在保护继承中,对于垂直访问同与公有继承,而对于水平访问同于私有继承。1 39. 派生类是它的基类的组合。0 40. 构造函数可以被继承。1 41. 析构函数不能被继承。1 42. 子类型是不可逆的。0 43. 只要是类M继承了类N,就可以类M是类N的子类型。1 44. 如果A类型是B类型的子类型,则A类型必然适应于B类型。1 45. 多继承情况下,派生类的构造函数的执行顺序取决于定义派生类时所指定的各基类的顺序。1 46. 单继承情况下,派生类对基类的成员的访问也会出现二义性。? 47. 解决多继承情况下出现的二义性的方法之一就是使用成员名限定法。1 48. 虚基类是用来解决多继承中公共基类在派生类中只产生一个基类子对象的问题。1 四、写出下列程序的运行结果 1、#include using namespace std; class A{ friend double count(A&); public: A(double t, double r):total(t),rate(r){} private: double total; double rate; }; double count(A& a){ a.total+=a.rate*a.total; return a.total; } int main(void){ A x(80,0.5),y(100,0.2); cout< 2、#include static int counter; int obj_id; public: Count(); //constructor static void display_total(); //static function void display(); ~Count(); //destructor 3、#include class example { private: }; int Count::counter; //definition of static data member Count::Count() { counter++; obj_id = counter; } Count::~Count() { counter--; cout<<\"Object number \"< cout <<\"Number of objects created is = \"< Count::display_total(); a2.display(); a4.display(); return 0; } 运行结果: Number of objects created is = 1 Number of objects created is = 4 Object ID is 2 Object ID is 4 Object number 4 being destroyed Object number 3 being destroyed Object number 2 being destroyed Object number 1 being destroyed int date; static int count; public: example(int y=10):date(y) { cout<<”date=”< static int display() {return count;} }; int example::count=0; void main() {example e1; example e2(20); cout< 4.#include class A{ public: A(); A(int i,int j); ~A(){cout<<\"Donstructor.\\n\";} void print(); private: int a,b; }; A::A() { a=b=10;cout<<\"Default constructor.\\n\";} A::A(int i,int j) { a=i,b=j;cout<<\"Constructor.\\n\";} void A::print() {cout<<\"a=\"<A m,n(15,18); m.print(); n.print(); } Default constructor. Constructor. a=10,b=10 a=15,b=18 Donstructor. Donstructor. 5、#include #include class Base { private: char msg[30]; protected: int n; public: Base(char s[],int m=0):n(m) { strcpy(msg,s); } void output(void) { cout< private: int n; public: Derived2(int m=2): Derived1(m-1) { n=m; } void output(void) { cout< 程序运行结果: 1 Base Class 2 1 0 Base 6、#include X(int i) { x=i; cout<<”int: ”<x=(int)i*2; cout<<” double: ”<{ cout<<” ~X(): ”< int a=8; double b=11.0; X x1(55), x2(a*5); X x3=X(2*a); X x4=X(b); } 程序输出结果: int: 55,called int: 40,called int: 16,called double: 11,called ~X(): 22,called ~X(): 16,called ~X(): 40,called ~X(): 55,called 7. #include { Samp *p; p=new Samp[5]; if(!p) { cout<<\"Allocation error\\n\"; return 1; } for(int j=0;j<5;j++) p[j].Setij(j,j); for(int k=0;k<5;k++) cout<<\"Muti[\"< delete[]p; return 0; } Muti[0] is:0 Muti[1] is:1 Muti[2] is:4 Muti[3] is:9 Muti[4] is:16 Destroying..4 Destroying..3 Destroying..2 Destroying..1 Destroying..0 8、 #include int func(int a) { int b=0; static int c=4; b++; c--; return(a+b+c); } void main( ) { int a=2; for(int j=0;j<2;j++) cout< class Abc {public: Abc( ){a=0; b=0; c=0;} Abc(int i,int j,int k){a=i; b=j; c=k;} void get(int&i,int&j,int&k){i=a; j=b; k=c;} Abc operator * (Abc obj); private: int a,b,c; }; Abc Abc::operator * (Abc obj) {Abc tempobj; tempobj.a=a*obj.a; tempobj.b=b*obj.b; tempobj.c=c*obj.c; return tempobj; } void main() { Abc obj1(1,2,3),obj2(5,5,5),obj3; int a,b,c; obj3=obj1*obj2; obj3.get(a,b,c); cout<<”(obj1*obj2):\”<<”a=”<(obj2 * obj3).get(a,b,c);