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;
}
全部评论
太棒了
点赞 回复
分享
发布于 2022-11-05 21:19 安徽

相关推荐

TP-LINK 前端工程师 年包大概20出头 本科
点赞 评论 收藏
转发
3 2 评论
分享
牛客网
牛客企业服务