友元函数基础定义:
类的友元函数是定义在类外部,但可以访问类的所有私有(private)成员和保护(protected)成员。
同时:
友元可以是一个函数,该函数被称为友元函数;
友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
注意:
声明函数为一个类的友元时,用关键字 friend修饰。
友元函数并不是成员函数。
举个例子:
用友元函数输出年月日
class Date {
private:
int year,month,day;
public:
friend void date(Date date);//创建友元函数
void input(int,int,int);//创建普通函数
};
//普通函数要用 类名::函数名 来访问函数
void Date::input(int y,int m,int d) {
year=y;
month = m;
day= d;
}
//友元函数能直接使用 对象.变量名 访问类私有(private)成员和保护(protected)成员
void date(Date date) {
cout << "当前是" << date.year << "年" << date.month << "月" << date.day << "日";
}
int main()
{
Date da;//创建Date类对象
da.input(2021, 11, 30);//用对象引用函数修改函数
date(da);//调用友元函数打印日期
}
打印结果:
再举个例子:
用友元函数输出年月日和时间
class Time; //先写一个类
class Date {
private:
int year,month,day;
public:
friend void date(Date date, Time time); //创建含两个类关系的友元函数
void input(int,int,int);//创建普通函数
};
//普通函数要用 类名::函数名 来访问函数
void Date::input(int y,int m,int d) {
year=y;
month = m;
day= d;
}
//和上面 类和函数 两步写的内容一样
class Time {
private:
int hours, minute, second;
public:
//友元函数是定义在类外部,此时这样写相当于让这两个类都使用了这个友元函数
friend void date(Date date, Time time);
//不同方法里变量方法名重名不冲突,不引起读程序时的误会就能用
void input(int, int, int);
};
void Time::input(int h, int m, int s) {
hours = h;
minute = m;
second = s;
}
//友元函数能直接使用 对象.变量名 访问类私有(private)成员和保护(protected)成员
void date(Date date, Time time) {
//就能用同一个友元函数输出两个类的函数啦!
cout << "当前是" << date.year << "年" << date.month << "月" << date.day << "日" << time.hours << ":" << time.minute << ":" << time.second << "!";
}
int main()
{
Date da;//创建类的对象
Time ti;
da.input(2021, 11, 30);//利用对象引用普通函数
ti.input(20, 54, 32);
date(da, ti);//调用友元函数
}
打印结果: