C++第四章类与对象练习题
C++第四章类与对象练习题
习题来源: <<C++语言程序设计(第四版)>> 清华大学出版社 郑莉等编著
最后一次编辑时间: 2019-8-3
题目
4-1 解释public和private的作用,公有类型成员与私有类型成员有哪些区别?
4-2 protected关键字有何作用?
4-3 构造函数和析构函数有什么作用?
4-4 数据成员可以为公有的吗?成员函数可以为私有的吗?
4-5 已知class A中有数据成员inta,如果定义了A的两个对象a1,a2,它们各自的数据成员a的值可以不同吗?
4-6 什么叫做复制构造函数?复制构造函数何时被调用?
4-7 复制构造函数与赋值运算符(=)有何不同?
4-8 定义一个Dog类,包含了age,weight等属性,以及对这些属性操作的方法。实现并测试这个类。
4-9 设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算矩形的面积。
4-10 设计一个用于人事管理的“人员”类。由于考虑到通用性,这里只抽象出所有类型人员都具有的属性:编号、性别、出生日期、身份证号等。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录人和显示。要求包括:构造函数和析构函数、复制构造函数、内联成员函数、带默认形参值的成员函数、类的组合。
4-ll 定义并实现一个矩形类,有长、宽两个属性,由成员函数计算矩形的面积。
4-12 定义一个DataType(数据类型)类,能处理包含字符型、整型、浮点型3种类型的数据,给出其构造函数。
4-13 定义一个Circle类,有数据成员radius(半径),成员函数getArea(),计算圆的面积,构造一个Circle的对象进行测试。
4-14 定义一个Tree(树)类,有成员ages(树龄),成员函数grow(int years)对ages 加上years,age()显示tree对象的ages的值。
4-15 根据例4-3中关于Circle类定义的源代码绘出该类的UML图形表示
4-16 根据下面C++代码绘出相应的UML图形,表示出类ZRF、类SSH和类Person之间的继承关系。
class Person ( public: Peraon (const Person& right); ~Person (); private: char Name; int Age; }; class ZRF : protected Person {}; class SSH : private Person {};
4-17 在一个大学的选课系统中,包括两个类:CourseSchedule类和Course类。其关系为:CourseSchedule 类中的成员函数add和remove的参数是Course类的对象,请通过UML方法显式表示出这种依赖关系。
4-18 在一个学校院系人员信息系统中,需要对院系(Department)和教师(Teacher)之间的关系进行部分建模,其关系描述为:每个Teacher可以属于零个或多个Department的成员,而每个Department至少包含一个Teacher作为成员。根据以上关系绘制出相应的UML类图。编写一个名为CPU的类,描述一个CPU的以下信息:时钟频率,最大不会超过
4-20 定义一个负数类Complex,使得下面的代码能够工作。
Complex c1(3,5); //用复数3+5i初始化c1 Complex c2=4.5; //用实数4.5初始化c2 c1.add(c2); //将c1与c2相加,结果保存在c1中 c1.show(); //将c1输出(这时的结果应该是7.5+5i)
解答
4-1 解释public和private的作用,公有类型成员与私有类型成员有哪些区别?
private定义的私有类型成员只允许本类的函数成员访问
4-2 protected关键字有何作用?
保护类型成员, 派生类的成员函数可以访问基类的保护成员
4-3 构造函数和析构函数有什么作用?
分别完成初始工作和清理工作
4-4 数据成员可以为公有的吗?成员函数可以为私有的吗?
都可以
4-5 已知class A中有数据成员int a,如果定义了A的两个对象a1,a2,它们各自的数据成员a的值可以不同吗?
可以
4-6 什么叫做复制构造函数?复制构造函数何时被调用?
一种特殊的构造函数, 参数是本类对象的引用, 作用是用一个已存在的对象去初始化一个新的同类的对象
- 对象1(对象2)
- 函数(参数 对象)
- 函数() {... return 对象}
4-7 复制构造函数与赋值运算符(=)有何不同?
前者创建新对象, 后者作用于已经存在的对象
4-8 定义一个Dog类,包含了age,weight等属性,以及对这些属性操作的方法。实现并测试这个类。
#include<iostream> #include<stdlib.h> using namespace std; class Dog { public: Dog(int age = 0, double weight = 20) { this->age = age; this->weight = weight; } ~Dog() {} int getAge() { return this->age; } void setAge(int age) { this->age = age; } void setWeight(double weight) { this->weight = weight; } double getWeight() { return this->weight; } private: int age; double weight; }; int main() { Dog Jack(2, 15); cout << "Jack is a Dog who is "; cout << Jack.getAge() << " years old and " << Jack.getWeight() << " pounds weight" << endl; Jack.setAge(13); Jack.setWeight(22); cout << "Now Jack is "; cout << Jack.getAge() << " years old and " << Jack.getWeight() << " pounds weight" << endl; system("pause"); return 0; }
4-10 设计一个用于人事管理的“人员”类。由于考虑到通用性,这里只抽象出所有类型人员都具有的属性:编号、性别、出生日期、身份证号等。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、复制构造函数、内联成员函数、带默认形参值的成员函数、类的组合。
#include<iostream> #include<stdlib.h> using namespace std; class Date { private: int year; int month; int day; public: Date() {} Date(int year, int month, int day); void showDate(); void setDate(int year, int month, int day); ~Date() { } }; class Person { public: Person(long num, char sex, long id, int year, int month, int day): date(year, month, day) { this->num = num; this->sex = sex; this->id = id; } Person(int year, int month = 1, int day = 1) : date(year, month, day) {} Person() {} Person(Person &p); void setPerson(); void showPerson(); ~Person() { } private: long num; char sex; Date date; long id; }; Date::Date(int year, int month, int day) { this->year = year; this->month = month; this->day = day; } void Date::showDate() { cout << "year-month-day: " << year << "-" << month << "-" << day << endl; } void Date::setDate(int year, int month, int day) { this->year = year; this->month = month; this->day = day; } Person::Person(Person &p) { this->num = p.num; this->id = p.id; this->sex = p.sex; } void Person::showPerson() { cout << "num: " << num << endl; cout << "sex: " << sex << endl; cout << "date: "; date.showDate(); cout << "id: " << id << endl; } void Person::setPerson() { int year; int month; int day; cout << "请输入编号: "; cin >> this->num; cout << "请输入性别: "; cin >> this->sex; cout << "请输入身份证号: "; cin >> this->id; cout << "请输入出生年月日:" << endl; cin >> year >> month >> day; this->date.setDate(year,month,day); } int main() { Person p; p.setPerson(); p.showPerson(); system("pause"); return 0; }
4-12 定义一个DataType(数据类型)类,能处理包含字符型、整型、浮点型3种类型的数据,给出其构造函数。
#include<iostream> #include<stdlib.h> using namespace std; class DataType { private: // 枚举类型, 作类型判断 enum { character, integer, floating_point }vartype; // 无名联合体做类的内嵌成员, 联合体内部成员可直接访问 union { char c; int i; float f; }; public: DataType(char ch) { this->vartype = character; this->c = ch; } DataType(int li) { this->vartype = integer; this->i = li; } DataType(float ff) { this->vartype = floating_point; this->f = ff; } void print(); }; void DataType::print() { switch (vartype) { case character: cout << "字符型: " << c << endl; break; case integer: cout << "整型: " << i << endl; break; case floating_point: cout << "浮点型: " << f << endl; break; } } int main() { DataType d1('a'), d2(12), d3(1.5f); d1.print(); d2.print(); d3.print(); system("pause"); return 0; }
4-15 根据例4-3中关于Circle类定义的源代码绘出该类的UML图形表示
4-16 根据下面C++代码绘出相应的UML图形,表示出类ZRF、类SSH和类Person之间的继承关系。
class Person ( public: Peraon (const Person& right); ~Person (); private: char Name; int Age; }; class ZRF : protected Person {}; class SSH : private Person {};
4-17 在一个大学的选课系统中,包括两个类:CourseSchedule类和Course类。其关系为:CourseSchedule 类中的成员函数add和remove的参数是Course类的对象,请通过UML方法显式表示出这种依赖关系。
4-18 在一个学校院系人员信息系统中,需要对院系(Department)和教师(Teacher)之间的关系进行部分建模,其关系描述为:每个Teacher可以属于零个或多个Department的成员,而每个Department至少包含一个Teacher作为成员。根据以上关系绘制出相应的UML类图。
4-20 定义一个负数类Complex,使得下面的代码能够工作。
Complex c1(3,5); //用复数3+5i初始化c1 Complex c2=4.5; //用实数4.5初始化c2 c1.add(c2); //将c1与c2相加,结果保存在c1中 c1.show(); //将c1输出(这时的结果应该是7.5+5i)
#include<iostream> #include<stdlib.h> using namespace std; class Complex { public: Complex(double r, double i) :real(r), image(i) {} Complex(double r) :real(r), image(0) {} void show(); void add(Complex c2); private: double real; double image; }; void Complex::add(Complex c2) { this->real += c2.real; this->image += c2.image; } void Complex::show() { if (this->image == 0) { cout << this->real << endl; } else { cout << this->real; if (this->image < 0) { cout << this->image <<"i"<< endl; } else { cout << "+" << this->image << "i" << endl; } } } int main() { Complex c1(1.4, 2.3); Complex c4(4.5, -4.5); c1.show(); c1.add(c4); c1.show(); system("pause"); return 0; }