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;
} 
京公网安备 11010502036488号