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

来源:互联网 发布:java 二进制流上传 编辑:程序博客网 时间:2024/05/17 04:37
---------------------------1------------------------/*    友元函数:    i.非成员函数作为友元函数:      ①在类中:friend + 类型 + 函数名(参数) <-------声明        在类外:类型 + 函数名(对象参数) <-------定义      ②可在多个类中声明同一个友元函数,其声明与定义如上(只需在类外定义1次)      ③注意:在定义友元函数时其参数一般为类的对象,因此若要定义多个类的友元函数,要提前声明各类。    ii.成员函数作为友元函数(友元函数可直接访问其主类的成员,访问其他类的成员需加上其他类的对象名)      ①在主类中:类型 + 函数名(参数) <-------声明,和声明成员函数一样        在其他类中:friend + 类型 + 主类名 + “::” + 友元函数名(参数)      ②在定义友元函数时其参数一般为类的对象,因此若要定义多个类的友元函数,要提前声明各类。*/// 由于声明多个类的友元函数与单个类的友元函数形式一样,因此本例使用多个函数的友元函数。#include <iostream>using namespace std;class Date;    // 此处为提前声明类 Dateclass 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