作业补做-第六次实验-项目3

项目6:友元类

一、问题及代码

[cpp]  view plain  copy 
  
  在CODE上查看代码片 派生到我的代码片
  1. /*  
  2. * 文件名称:zuoye-补.cpp  
  3. * 作    者:戴光彤
  4. * 完成日期:2017 年 5月 8日  
  5. * 版 本 号:v1.0  
  6. * 对任务及求解方法的描述部分:类与对象
  7. * 输入描述:无  
  8. * 问题描述:项目3:友元类

    定义下面两个类的成员函数(为体验友元类,实际上本例并不一定是一个好的设计,将两个类的合并为一个DateTime,日期、时间都处理更好)

  9. * 程序输出:
  10. * 算法设计:略  
  11. */    
  12. #include <iostream>  
    using namespace std;  
    class Date; //对Date类的提前引用声明  
    class Time  
    {  
    public:  
        Time(int,int,int);  
        void add_a_second(Date &);  //增加1秒,1秒后可能会到了下一天,乃到下一月、下一年  
        void display(Date &);  //显示时间,格式:月/日/年 时:分:秒  
    private:  
        int hour;  
        int minute;  
        int sec;  
    };  
      
    class Date  
    {  
    public:  
        Date(int,int,int);  
        friend class Time;  //Time定义为Date的友元类  
    private:  
        int month;  
        int day;  
        int year;  
    };  
      
    int main( )  
    {  
        Time t1(22,59,32);  
        Date d1(1,25,2012);  
        for(int i=0; i<=80; i++)  
        {  
            t1.add_a_second(d1);  
            t1.display(d1);  
        }  
        return 0;  
    }  
    //下面定义两个类中的成员函数,要求不得再增加成员函数  
    //注意体会在Time的成员函数中可以调用Date类的私有数据成员  
    Time::Time(int h,int m,int s)  
    {  
        hour=h;  
        minute=m;  
        sec=s;  
    }  
    Date::Date(int m,int d,int y)  
    {  
        month=m;  
        day=d;  
        year=y;  
    }  
    void Time::add_a_second(Date &d)  
    {  
        if(++sec>=60) ++minute,sec-=60;  
        if(minute>=60) ++hour,minute-=60;  
        if(hour>=24) ++d.day,hour-=24;  
        if(d.day>30) ++d.month,d.day-=30;
        if(d.month>12) ++d.year,d.month-=12; 
    }  
    void Time::display(Date &d)  
    {  
        cout<<d.month<<"/"<<d.day<<"/"<<d.year<<" ";  
        cout<<hour<<":"<<minute<<":"<<sec<<endl;  
    }  

二、运行结果:

三、心得体会:

当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:

friend class 类名(即友元类的类名);

其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

    

四、知识点总结:

       

(1) 友元关系不能被继承。

(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。

(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。

(4)类B是类A的友元,类B的成员函数可以访问类A的所有成员,但是类A的成员函数可以访问类B的私有成员和保护成员。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值