C++程序设计语言 ( 第2次 )
发布时间:2023-04-20 08:04:29浏览次数:105第 2 次作业一、单项选择题(本大题共 40 分,共 20 小题,每小题 2 分)1. 下列代码中,( )能够正确第将类 A 申明为类 B 的友元类。A. class B { friend class A;}B. class B { friend A;}C. class A { friend class B;}D. class A{ friend B;}2. 类 A 使用虚基类的方式,从类 B 派生而来。下面( )准确定义了这种继承方式。A. virtual class B{}; virtual class A : public B {};B. virtual class B{}; class A : virtual public B {};C. class B{}; class A : virtual public B {};D. virtual class B{}; class A : public B {};3. 下面代码执行结束后的输出是( ) #include using namespace std; class A{ private: int x; public: A(int a){x=a;} A(A &a){x=a.x;} void show(){cout << “x:” << x << “ “;} }; void main(){ A a1(5); a1.show(); A a2(a1); a2.show(); } A. x:5 x:5B. x:5C. 编译有错D. 以上答案都不对4. 声明类模板时,形参具有类型或值的默认实参值,那么在实例化类模板时( )。A. 必须使用默认实参值B. 必须指定实参值C. 可以使用默认参数和指定参数D. 只能指定实参或者只能使用默认实参值5. 如果类 A 是类 B 的基类,两个类中都有同名的成员函数 fun,下列( )能够正确调用到 A 类的成员函数 fun。A. B *b; b->fun();B. B b; B &br=b; br.fun();C. B b; b.A::fun();D. B b; b.fun();6. 有类的定义如下: class A{ private: int x,y; public: A(int m,int n){x=m;y=n;} }; Class B{ private: int z; A a; public: B(int m); }; 下列( )是正确的 B 类构造函数实现代码。 A. B::B(int m) : a(m), z(m){ }B. B::B(int m) : a(),z() { }C. B::B(int m) : a(m,m), z(m){ } D. B::B(int m) : a=(m,m), z=m { }
7. 使用类模板,就必须显式指定模板( )。A. 变量B. 实参C. 形参D. 类型8. 下列( )能够正确地申明友元函数,让函数 fun 能够访问类 A 的私有成员。A. void fun() friend class A;B. Friend class A{private: int i; void fun();};C. class A{private: int i; friend fun();};D. class A{private: int i; friend void fun();};9. 下列关于类的定义中正确的是( )。A. class C { int a,b;}B. class C { int a; int b;}C. class C {int a=10; int b;};D. class C {int a; int b;};10. 下列代码中,( )能够通过一个对象数组元素访问成员函数。A. (arr[2])->show();B. (*arr[2]).show();C. (&arr[2]).show();D. (*(arr+2)).show();11. 下列关于虚函数的说法中,( )项是错误的。A. 构造函数不能申明为虚函数B. 析构函数不能申明为虚函数C. 如果要使用虚函数来实现多态,必须满足类型兼容原则D. 通常将需要派生类重写的函数申明为虚函数12. 下面( )项能够正确地申明重载“++”运算符的后缀形式为类 A 的成员函数。A. A operator ++(int);B. A operator ++();C. A operator ++(0);D. A operator ++(A,int);13. 下列关于静态成员函数的说法中,错误的是( )。A. 静态成员函数只能访问类的静态数据成员B. 静态成员函数也可以通过形参的方式操作类的对象,但最好不要这样处理,因为静态成员函数只处理与类属性有关的操作更加容易理解。C. 静态成员函数可以访问类的非静态成员函数
D. 虽然可以采用“对象.静态成员函数”的方式访问静态成员函数,但是仍然推荐使用“类名::静态成员函数”的方式。14. 下面( )种多态形式是由动态联编来实现的。A. 重载多态 B. 强制多态C. 参数多态D. 包含多态15. 使用文件流对象从指定文件中读取数据时,表达式形式为( )。A. <输出流对象名> >> <变量名>B. <输入流对象名> << <变量名>C. <输出流对象名> << <变量名>D. <输入流对象名> >> <变量名>16. 下列的代码运行时不会发生拷贝构造函数调用的是( )。A. Point p1(1,2); Point p2(p1)B. Point p1(1,2); Point p2; p2=p1;C. void printPoint(Point p){……}D. Point createPoint(){Point p; …… return p;}17. 有类 A 的定义如下: class A{ public: A(int x,int y); private: int x; const int y; }; 下列关于类 A 的构造函数的代码中,( )能够正确地给成员变量 x,y 赋初值。 A. A::A(int x,int y):y(y){x=x;};B. A::A(int x,int y):x(x){y=y;};C. A::A(int x,int y):y(y){this->x=x;};D. A::A(int x,int y):x(x){this->y=y;};18. 下列语句中,能够正确定义一个对象引用的是( )。A. Point p(1,2); Point &r; r=p;B. Point p(1,2); Point &r=p;C. Point &r=p(1,2);D. Point &r; Point p(1,2); r=p;19. 浅拷贝与深拷贝的区别在于( )。A. 深拷贝在对非指针成员变量赋值的同时,也对指针成员变量赋值,从而达到所有的成员变量都被赋值的效果B. 深拷贝会在为成员变量赋值时,将指针成员变量所指向的内存空间也复制一份,让现有对象的指针变量指向这个空间,并且会对对象成员进行上述递归赋值操作C. 深拷贝会将已有对象的对象成员,逐一递归进行赋值D. 深拷贝会使已有对象和现有对象的指针成员变量指向同一块内存空间
20. 下列语句中,能够正确初始化一个对象数据的是( )。A. Point arr[3]=(Pont(1,2),Point(3,4),Point(5,6));B. Point arr[3]={(1,2), (3,4), (5,6)};C. Point arr[]={Point(1,2),Point(3,4),Point(5,6)};D. Point arr[3]={Point(1,2);Point(3,4);Point(5,6)};二、判断题(本大题共 60 分,共 20 小题,每小题 3 分)1.函数重载只会发生在相同作用域范围内,而基类的成员和派生类成员属于不同的作用域范围,所以派生类重写的同名函数不会重载基类的同名函数。2. 无论采用何种方式来生成派生类,基类的私有成员都不能被访问。3. C++语言支持多重继承,派生类将继承多个父类中共有的同名属性和方法。4. STL 算法中,可变序列算法是对容器内容进行数值计算。5. 虚基类、直接派生类和间接派生类的析构函数调用顺序完全与它们的构造函数调用顺序相反。6. 定义对象数组时,对于没有给定初始值的数组元素,系统将通过调用默认构造函数的方式进行初始化。7. 当以非成员函数形式重载运算符时,有时需要访问参与运算的对象的私有成员,那么我们可以将这个成员函数设置为类的友元函数。8. 使用私有继承来生成派生类时,基类的公有和保护成员可以被访问,但是私有成员不能被访问。9. 类模板的参数的默认参数值声明时,如果有多个参数,第一个默认参数后的所有参数必须具有默认参数。10. 封装是指将一个事物对外联系的属性和行为暴露出来,同时隐藏内部运行机制有关的属性和行为的方法。11. 只有私有继承方式中,派生类的自定义成员函数才能访问基类的私有成员,其它任何一种派生方式都不允许派生类自定义成员函数访问基类的私有成员。12. 基类的同名函数会被派生类的同名函数屏蔽,它不会出现在派生类中,当然也不可能使用派生类对象访问基类的同名函数。13. C 语言采用面向对象的思想来进行程序设计;而 C++语言采用面向过程的思想来进行程序设计。14. 无论运算符被重载为类的成员函数还是非成员函数,在函数中都可以访问参与运算的对象的私有成员。15. 抽象类主要用来进行系统的设计,它的定义往往出现在某一簇类的定义之前,提前描述其它几个类的共同公有成员函数,它是这一簇类的基类。16. 成员函数全部都是纯虚函数的类,被称为抽象类,不能够被实例化。如果具有非纯虚成员函数,那么这个类就是具体类,可以被实例化。17. 运算符的重载从本质上来看仍然是函数重载,编译器会将使用运算符的表达式翻译成函数调用。18. 抽象类是在类的基础上进一步抽象,它定义了某一簇类的共有方法,描述了这一簇类的公有接口。
19. this 指针被隐含地传递到每一个成员函数中,包括静态成员函数。20. 无论虚基类是否定义了默认构造函数,派生类都必须在自己的构造函数中,使用初始化列表去调用虚基类的构造函数。答案:一、单项选择题(40 分,共 20 题,每小题 2 分)1. A 2. C 3. A 4. C 5. C 6. C 7. B 8. D 9. D 10. D 11. B 12. A 13. C 14. D 15. D 16. B 17. C 18. B 19. B 20. C 二、判断题(60 分,共 20 题,每小题 3 分)1. √ 2. √ 3. × 4. × 5. √ 6. √ 7. √ 8. √ 9. √ 10. √ 11. × 12. × 13. × 14. × 15. √ 16. × 17. √ 18. √ 19. × 20. ×