---------------------------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;
}
C++ 学习之路(5):友元函数与友元类
最新推荐文章于 2024-06-20 09:00:44 发布