面向对象程序设计第五章作业题

更新时间:2023-11-23 17:57:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第五章作业题

一.填空题

1. 面向对象程序设计有4个主要特点: ____、 ____ 、____和____。 2. 用来派生新类的类称为_______,而派生出的新类称为它的子类或派生类。

3. “图形”类Shape中定义了纯虚函数CalArea(),“三角形”类Triangle继承了类Shape,

请将Triangle类中的CalArea函数补充完整。 class Shape{ public:

virtual int CalArea()=0; }

class Triangle: public Shape{ public:

Triangle{int s, int h}: side(s),height(h) {} ________________ { return side*height/2 ; } private: int side; int height; };

4. 继承方式包括:____、____、____;如果省略,系统默认为____。

5. 派生类中的成员包括从____和____两大部分。 二.单项选择题

1.下列关于继承方式的描述中,错误的是( )。

A.如果不显式地指定继承方式,缺省的继承方式是私有(private) B.采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成员 C.采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员

D.采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员 2. 下列代码声明了3个类 class Person{};

class Student:public Person{}; class Undergraduate:Student{};

下列关于这些类之间关系的描述中,错误的是( )。

A.类Person是类Undergraduate的基类 B.类Undergraduate从类Student公有继承 C.类Student是类Person的派生类 D.类Undergraduate是类Person的派生类 3. 以下关于C++类的说法中,正确的是( )。

A.C++语言的默认访问权限是private

B.C++语言中的类定义,用户一定要自己定义一个构造函数用于实例化类 C.C++语言中的成员函数的实现部分一定要写在类定义外 D.C++语言中的类不能够嵌套定义

4. 下面选项中不属于面向对象程序设计特征的是( )。

A.继承性

B.多态性

C.类比性

D.封装性

5. 派生类对象对其基类中的什么成员是可访问的( )。

A.公有继承的私有成员 C.公有继承的保护成员

B.私有继承的公有成员 D.公有继承的公有成员

6.如果派生类以public方式继承基类,则原基类的protected成员和public成员在派生类中的访问类型分别是( )。

A. public和public

B.public和protected D. protected 和protected

C.protected 和public

7.派生类的成员函数不能访问基类的( )。

A.共有成员和保护成员

B. 共有成员

C. 私有成员

D. 保护成员

8. 下列关于派生类构造函数和析构函数的说法中,错误的是( )。

A.派生类的构造函数会隐含调用基类的构造函数

B.如果基类中没有缺省构造函数,那么派生类必须定义构造函数

C.在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数 D.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数 9.定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为( )。

A.私有继承

B.非私有继承

C.保护继承

D.公有继承

10.建立一个有成员对象的派生类对象时,各构造函数体的执行次序为( )。

A.派生类、成员对象类、基类 C.基类、成员对象类、派生类

B.成员对象类、基类、派生类 D.基类、派生类、成员对象类

11.下列关于虚基类的描述中,错误的是( )。

A.使用虚基类可以消除由多继承产生的二义性 B.构造派生类对象时,虚基类的构造函数只被调用一次 C.声明“class B : virtual public A”说明类B为虚基类 D.建立派生类对象时,首先调用虚基类的构造函数

12.一个类可以同时继承多个类,称为多继承。下列关于多继承和虚基类的表述中,错误的是( )。

A.每个派生类的构造函数都要为虚基类构造函数提供实参 B.多继承时有可能出现对基类成员访问的二义性问题 C.使用虚基类可以解决二义性问题并实现运行时的多态性 D.建立最派生类对象时,虚基类的构造函数会首先被调用

13.在公有派生的情况下,派生类中定义的成员函数只能访问原基类的( )。 A.公有成员和私有成员

C.公有成员和保护成员

B.私有成员和保护成员

D.私有成员、保护成员和公有成

14.下列关于继承方式的描述中,错误的是( )。

A.如果不显式地指定继承方式,缺省的继承方式是私有(private) B.采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成员 C.采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员 D.采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员 15.下列关于派生类构造函数和析构函数的说法中,错误的是( )。

A.派生类的构造函数会隐含调用基类的构造函数

B.如果基类中没有缺省构造函数,那么派生类必须定义构造函数

C.在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数 D.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数 16.下列有关继承和派生的叙述中,正确的是( )。

A.派生类不能访问基类的保护成员

B.作为虚基类的类不能被实例化

C.派生类应当向基类的构造函数传递参数 D.虚函数必须在派生类中重新实现 17.派生类的成员函数不能访问基类的( )。

A.公有成员和保护成员

B.共有成员

C.私有成员 D.保护成员

18.在一个派生类的成员函数中,试图调用其基类的成员函数“void f(); ”,但无法通过编译,

这说明( )。

A.f()是基类的私有成员

C.派生类的继承方式为私有

B.f()是基类的保护成员 D.派生类的继承方式为保护

19.对于通过公有继承定义的派生类,若其成员函数可以直接访问基类的某个成员,说明该

基类成员的访问权限是( )。 A.公有或私有

三.改错题

B.私有 C.保护或私有 D.公有或保护

1、请改正这些错误,使程序的输出结果为:The value is:10 #include using namespace std; class Member {

// ERROR ********found******** private:

Member(int val) : value(val) {} int value; };

class MyClass { Member _m; public:

// ERROR ********found******** MyClass(int val) {}

int GetValue() const { return _m.value; } };

int main() {

MyClass *obj = new MyClass(10);

// ERROR ********found******** 下列语句输出obj指向类中的value值 cout << \ delete obj; return 0; }

2、更正后程序的输出应为: value = 63 number = 1

#include using namespace std;

class MyClass { int* p;

const int N; public:

// ERROR **********found**********

MyClass(int val) : N=1 {

p = new int; *p = val; }

// ERROR **********found********** ~MyClass() { delete *p; }

friend void print(MyClass& obj); };

// ERROR **********found********** void MyClass::print(MyClass& obj) {

cout << \ cout << \}

int main() {

MyClass obj(63); print(obj); return 0; }

四.程序填空题

1. 此工程中声明的Array是一个表示数组的类。一个Array对象可以包含多个整型元素。Array的成员说明如下:

成员函数add用于向数组的末尾添加一个元素; 成员函数get用于获取数组中指定位置的元素; 数据成员a表示实际用于存储数据的整型数组;

数据成员size表示数组的容量,数组中的元素个数最多不能超过size; 数据成员num表示当前数组中的元素个数。

SortedArray是Array的派生类,表示有序数组。SortedArray重新定义了Array中的add函数,以确保有序数组中的元素始终按照升序排列。请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类定义。此程序的正确输出结果应为: 10,9,8,7,6,5,4,3,2,1, 1,2,3,4,5,6,7,8,9,10,

#include

using namespace std;

class Array { public:

Array(unsigned int s) {

size = s; num = 0;

a = new int[s]; }

virtual ~Array() { delete[] a; }

virtual void add(int e) {

if (num < size) {

//**********found********** ___________ num++; } }

int get(unsigned int i) const {

if (i < size) return a[i]; return 0; }

protected: int *a;

unsigned int size, num; };

class SortedArray : public Array { public:

//**********found**********

SortedArray(unsigned int s) : _______________ { }

virtual void add(int e) {

if (num >= size) return;

int i=0, j;

while (i < num) {

if (e < a[i]) {

for (j = num; j > i; j--) {

//**********found********** _______________; }

//**********found********** _______________; break; } i++; }

if (i == num) a[i] = e; num++; } };

void fun(Array& a) {

int i;

for (i = 10; i >= 1; i--) { a.add(i); }

for (i = 0; i < 10; i++) { cout << a.get(i) << \ }

cout << endl; }

int main() {

Array a(10); fun(a);

SortedArray sa(10); fun(sa);

return 0; }

2. 程序定义了CharShape类、Triangle类和Rectangle类。

CharShape是一个抽象基类,它表示由字符组成的图形(简称字符图形),纯虚函数Show用于显示不同字符图形的相同操作接口。Triangle和Rectangle是CharShape的派生类,它们分别用于表示字符三角形和字符矩形,并且都定义了成员函数Show,用于实现各自的显示操作。程序的正确输出结果应为:

* *** ***** ******* ######## ######## ########

请阅读程序,分析输出结果,然后根据以下要求在横线处填写适当的代码。 (1)将Triangle类的成员函数Show补充完整,使字符三角形的显示符合输出结果。 (2)将Rectangle类的成员函数Show补充完整,使字符矩形的显示符合输出结果。 (3)为类外函数fun添加合适的形参。

#include using namespace std; class CharShape { public:

CharShape(char ch) : _ch(ch) {}; virtual void Show() = 0; protected:

char _ch; // 组成图形的字符 };

class Triangle : public CharShape { public:

Triangle(char ch, int r) : CharShape(ch), _rows(r) {} void Show(); private:

int _rows; // 行数 };

class Rectangle: public CharShape { public:

Rectangle(char ch, int r, int c):CharShape(ch),_rows(r), _cols(c) {} void Show(); private:

int _rows, _cols; // 行数和列数 };

void Triangle::Show() // 输出字符组成的三角形 {

for (int i = 1; i <= _rows; i++) { //********found********

for (int j = 1; j <= __________; j++) cout << _ch; cout << endl; } }

void Rectangle::Show() // 输出字符组成的矩形 {

//********found********

for (int i = 1; i <= __________; i++) { //********found********

for (int j = 1; j <= __________; j++) cout << _ch; cout << endl; } }

//********found******** 为fun函数添加形参 void fun(__________) { cs.Show(); } int main() {

Triangle tri('*', 4);

Rectangle rect('#', 3, 8); fun(tri); fun(rect); return 0; }

五.程序设计题

(注意: 1.部分源程序已给出。请勿改动主函数main和其它函数中的任何内容,仅在*program*和*end*所标记的区域内完成题干要求的函数功能。 2.//标记开始与//标记结束内的程序可以忽略阅读。

1、题目:补充函数aver的代码,该函数计算n个学生成绩(通过参数cj传入)的平均分数。 #include #include using namespace std; void grading();

float aver(int cj[],int n) {

/**********Program**********/

/********** End **********/ }

int main() { grading(); return 0; } void grading() { fstream infile,myfile; int b[50]; int i;

infile.open(\

myfile.open(\ for(i=0;i<50;i++) infile>>b[i]; myfile<<(int)aver(b,50)<

2. 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 #include #include using namespace std; int grading(); int gcd(int m,int n) { int r; r=m%n;

/**********Program**********/

/********** End **********/ return n; }

int main() { int m,n; cout<<\请输入两个数:\\n\ cin>>m>>n; if(m

//以下忽略阅读 int grading() { int m, n;

ifstream infile(\ ofstream outfile(\

if(!infile.is_open() || !outfile.is_open()) {

cout<<\ return -1; }

for (int i=0; i<8; i++) {

infile >> m >> n;

outfile<

infile.close(); outfile.close(); return 0;

}

\

本文来源:https://www.bwwdw.com/article/3wct.html

Top