C++ 学习之路(5):友元函数与友元类

---------------------------1------------------------
/*
    友元函数:
    i.非成员函数作为友元函数:
      ①在类中:friend + 类型 + 函数名(参数) <-------声明
        在类外:类型 + 函数名(对象参数) <-------定义
      ②可在多个类中声明同一个友元函数,其声明与定义如上(只需在类外定义1次)
      ③注意:在定义友元函数时其参数一般为类的对象,因此若要定义多个类的友元函数,要提前声明各类。

    ii.成员函数作为友元函数(友元函数可直接访问其主类的成员,访问其他类的成员需加上其他类的对象名)
      ①在主类中:类型 + 函数名(参数) <-------声明,和声明成员函数一样
        在其他类中:friend + 类型 + 主类名 + “::” + 友元函数名(参数)
      ②在定义友元函数时其参数一般为类的对象,因此若要定义多个类的友元函数,要提前声明各类。

*/
// 由于声明多个类的友元函数与单个类的友元函数形式一样,因此本例使用多个函数的友元函数。
#include <iostream>
using namespace std;
class Date;    // 此处为提前声明类 Date
class Time
{
   public:
       Time(int h,int m,int s)
       {
            hour = h;
            minute = m;
            sec = s;
       }
       // 声明函数dispDate_Time()为类Time的成员函数
       void dispDate_Time(Date&);

       // 声明函数showDate_Time()为类Time的友元函数
       // 此处用到第三行类Date的声明 
       friend void showDate_Time(Date &d, Time &t);  

   private:
       int hour;
       int minute;
       int sec;
};
class Date
{
   public:
       Date(int y,int m,int d)
       {
            year = y;
            month = m;
            day = d;
       }
       // 声明类Time的成员函数dispDate_Time()为类Date的友元函数(成员函数作友元函数)
       friend void Time::dispDate_Time(Date&);

       // 声明函数showDate_Time()为类Date的友元函数(非成员函数作友元函数)
       friend void showDate_Time(Date &d, Time &t);

   private:
       int year;
       int month;
       int day;
};

// (非成员)友元函数的定义(形参分别为对类Date和类Time的对象的引用)
void showDate_Time(Date &d, Time &t)
{
    cout<<"友元非成员函数的调用:"<<endl;
    cout<<d.year<<"."<<d.month<<"."<<d.day<<endl;
    cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}

// (成员)友元函数的定义(形参为对类Date的对象的引用)
void Time::dispDate_Time(Date &d)
{
    cout<<"友元成员函数函数的调用:"<<endl;
    cout<<d.year<<"."<<d.month<<"."<<d.day<<endl;
    // 可直接调用本类Time数据成员
    cout<< hour <<":"<< minute <<":"<< sec <<endl; 
}
int main()
{
    Date date1(2016,3,12);  // 定义类Date的对象date1
    // 调用友元非成员函数showDate_Time()
    // 实参是对象date1和time1.
    showDate_Time(date1,time1); 

    Date date2(2016,3,12);  // 定义类Date的对象date2
    // 调用友元成员函数dispDate_Time()
    // 实参是对象date2和time2
    time2.dispDate_Time(date1); 

    return 0;
}


---------------------------2------------------------

/*
    友元类:
    i.将一个类X声明为另一个类Y的友元类。    
      即在类Y的声明中(可公有也可私有):friend X; <-------注意:要在类Y的定义之前提前声明类X,在定义完类Y后再定义类X。
    ii, 即 类X为类Y的友元类  <=> 即 类X中所有成员函数 都可访问 类Y中所有成员。
        (友元类的关系是单向的,不具交换性的.)

 */
#include <iostream>
using namespace std;
class Date;
class Time
{
   public:
       Time(int h,int m,int s)
       {
            hour = h;
            minute = m;
            sec = s;
       }
       // 声明函数showDate_Time()为类Time的成员函数
       void showDate_Time(Date&);
   private:
       int hour;
       int minute;
       int sec;
};
class Date
{
   public:
       Date(int y,int m,int d)
       {
            year = y;
            month = m;
            day = d;
       }
       // 声明类Time为类Date的友元类
       // 则类Time中的所有成员函数为类Date的友元函数
       friend Time;

   private:
       int year;
       int month;
       int day;
};
// 定义类Time的成员函数showDate_Time()
// 同时也为类Date的友元函数,形参为Date类对象的引用
void Time::showDate_Time(Date &d)
{
    cout<<"调用类Time的成员函数(也是类Date的友元函数):"<<endl;
    cout<<d.year<<"."<<d.month<<"."<<d.day<<endl;
    // 可直接调用本类Time数据成员
    cout<< hour <<":"<< minute <<":"<< sec <<endl; 
}

int main()
{
    Date date3(2016,3,12);  // 定义类Date的对象date3
    Time time3(21,30,34);   // 定义类TIme的对象time3
    // 调用类Time的成员函数showDate_Time(),也是类Date的友
    // 元函数。
    // 实参是对象date3和time3.
    time3.showDate_Time(date3); 

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值