首页 理论教育C++程序设计基础教程:Point和Distance构造

C++程序设计基础教程:Point和Distance构造

【摘要】:程序的执行结果如下:Point复制构造函数被调用Point复制构造函数被调用Point复制构造函数被调用Point复制构造函数被调用Distance构造函数被调用(1,2)和(8,6)两个点的距离:8.06226

【例2.27】编写一个程序,设计一个满足如下要求的CDate类,用数据进行调试并输出结果:

(1)用日/月/年格式输出日期

(2)可进行日期加一天的操作

(3)设置日期

解:设计一个日期类CDate,包含m_nYear(年),m_nMonth(月)和m_nDay(日)等3个私有数据成员,另外设计如下成员函数:

◇CDate():默认构造函数;

◇CDate(int,int,int):重载构造函数;

◇Display():以指定的格式输出日期;

◇AddDay():返回当前日期加1后的日期;

◇SetDate(int,int,int):用指定参数设置当前日期;

◇~CDate():析构函数;

◇IsLeapYear():判断当前年是否为闰年。

其中,IsLeapYear()函数只在内部使用,因此设计成私有成员函数,其他函数均为公有成员函数。

在main主函数中,定义CDate类的一个对象date,根据用户输入调用SetDate成员函数设置当前日期,再调用Display成员函数输出当前日期,然后调用AddDay成员函数将当前日期加1天,最后调用Display成员函数输出加1天后的日期。程序如下:

本程序的一次执行结果如下:

年月日:2019 3 18↙

当前日期:2019年3月18日

当前日期加1:2019年3月19日

【例2.28】编写一个程序,有若干教师和研究生,每个研究生有且仅有一名指导教师,每个教师可以带若干名研究生,建立一个教师对象数组和研究生对象数组,通过相关函数为每个研究生指定指导教师,最后输出所有研究生的完整信息和所有教师的完整信息。

解:设计一个教师类Teacher和一个研究生类Graduate,后者包含有一个Teacher类对象成员,前者包含有一个Graduate类对象指针数组。在Graduate类中设计有setteacher()成员函数用于设置每个研究生的导师。完整的程序如下:

程序的执行结果如下:

研究生列表

学号:201姓名:张三 导师:王进(101,副教授)

学号:202姓名:李四 导师:李清(103,教授)

学号:203姓名:王五 导师:陈果(102,教授)

学号:204姓名:刘六 导师:李清(103,教授)

学号:205姓名:赵七 导师:王进(101,副教授)(www.chuimin.cn)

教师列表

王进(101,副教授)

指导研究生人数:2

学号:201姓名:张三

学号:205姓名:赵七

陈果(102,教授)

指导研究生人数:1

学号:203姓名:王五

李清(103,教授)

指导研究生人数:2

学号:202姓名:李四

学号:204姓名:刘六

上述程序中,有两个难点需要进一步说明:

(1)在Graduate类中设计了一个导师对象t(一个研究生只有一名导师),而为什么Teacher类中不直接使用Graduate类对象数组,而使用Graduate类对象数组指针呢?

这是因为前向引用声明的规定,若在Teacher类中直接使用Graduate类对象数组,而此时Graduate类只是一个替换标识符,尚未声明,因此不能为这样的对象数组元素分配存储空间,而对象数组指针是可以分配存储空间的,因为在C++中每个指针,不论指向何种数据,分配的存储空间大小均为4个字节。

(2)设计Graduate类的成员函数setteacher,其代码如下:

其中,this指针是指向当前的研究生对象,例如,若s是一个研究生对象,t是一个教师对象,则执行s.setteacher(t)时,this就指向s对象(即this=&s),这样就可以执行t.assgraduate(&s)将s作为t的一个研究生加入t的研究生指针数组sp中了。

【例2.29】编写一个程序,设计一个点类Point和一个距离类Distance,后者的数据成员包括了Point类的两个对象p1和p2,并计算这两个点的距离。

解:两点的距离由Distance类构造函数求得,存放在其私有数据成员dist中,通过公有成员函数GetDis()来访问。完整的程序如下。

程序的执行结果如下:

Point复制构造函数被调用

Point复制构造函数被调用

Point复制构造函数被调用

Point复制构造函数被调用

Distance构造函数被调用

(1,2)和(8,6)两个点的距离:8.06226