解释友元
友元用通俗易懂的话来说,就是:当有人来到你家里,他就只能呆在客厅里面,你是不可能让他来到你的卧室之中的。但是如果这个人是你的朋友,那么你是默许他可以进入你的卧室的。
此时呢?我告诉你,这些分别是什么意思
外来人:普通函数
你家:所在的类
客厅:公有部分
卧室:私有部分
如果这个外来人是朋友:友元函数(只需要加上friend关键字即可),他是可以访问你的私有部分也就是卧室的,但是普通的外来人是不允许的!
什么是友元函数?
首先,了解友元函数之前,我们来想一想类内函数(成员函数)和类外函数有何区别。一,类内函数可以访问类的私有成员,并且自带一个this指针指向成员函数所指向的某一对象。二,类外函数,无法访问类的私有成员,且不带this指针。
比如,如果类内的成员函数我们在调用的时候一定是:对象.函数()这样调用,这就要求了这个函数的第一个,一定是这个对象(这个知识点,我们在后面运算符重载里面讲解),而友元函数是什么?
友元函数和普通的函数并无区别,也没有this指针。怎么做呢?接下来来讲讲:
1 友元函数可以访问一个类的私有成员,而其他的函数是无法访问的
2 他可以不属于任何类的普通函数,也可以是另一个类的成员函数。
怎么声明:
friend 返回值类型 函数名 (参数列表)
#include<iostream>
using namespace std;class Date //日期类
{
private:int year; //年int month;//月int day;//日
public:Date(int y, int m, int d) :year(y), month(m), day(d){}void show(){cout << year << "-" << month << "-" << day << endl;}//声明modifyDate是自己(Date类)的友元,可以访问自己的私有成员friend void modifyDate(Date& date, int year, int month, int day);
};void modifyDate(Date& date, int year, int month, int day)
{ //是Date的友元函数,可以访问date的私有数据date.year = year;date.month = month;date.day = day;//date.show();
}int main()
{Date today{ 2024,1,23 };today.show();modifyDate(today, 2023, 10, 1);today.show();return 0;
}
这里我们定义了一个友元函数,我们在类外写的时候,就像正常写自定义函数一样,该怎么写就怎么写,只不过声明的时候,我们需要在类内声明,并在最前面加上friend,就完了。
第二种友元:
class Date//日期类
{
private:int year;int month;int day;
public:Date(int y, int m, int d) :year(y), month(m), day(d){}void Calcutetime(const Time& t);//统计当前日期时间(包括日期和时间)是当年第几秒
};class Time//时间类
{//没有写访问权限,默认为privateint hour;int minute;int second;
public:Time(int h, int m, int s) :hour(h), minute(m), second(s){}friend void Date::Calcutetime(const Time& t); //友元函数
};
这里我们直接上代码,我没有去实现函数的能力,只是做一个演示。首先我们在Date类里面写了一个成员函数,但是我们想通过这个成员函数去访问另一个类,也就是Time类的私有成员。我们就只需要在Time类里面,把这个函数在Time里面声明,并加上friend。如此一来,Date就可以直接访问Time类的私有成员了。和第一种大差不差。我们继续
第三种友元函数:
友元类
class Date //日期类
{
private:int year;int month;int day;
public:Date(int y, int m, int d) :year(y), month(m), day(d){}friend class DateFriend; //友元类,DateFriend是自己(Date类)的友元类
};class DateFriend//这个类是可以访问Date类的私有成员的
{
public:void modifyDate(Date& date, int year, int month, int day);//修改日期void show(const Date& date);//输出数据
};void DateFriend::modifyDate(Date& date, int year, int month, int day)
{//友元类,可以直接访问date的私有成员date.year = year;date.month = month;date.day = day;
}
void DateFriend::show(const Date& date)
{//友元类,可以直接访问date的私有成员cout << date.year << "-" << date.month << "-" << date.day << endl;
}
这个就更简单明了,直接在另一个类中写上当前类的friend,那么当前这个类就可以直接访问到另一个类的所有成员,提醒,另一个类课不能访问当前类的私有成员。
就类似于,你认为他是你的朋友,你允许他访问你的卧室,但是你这么认为他不这么认为,他不觉得你是他的朋友,自然不允许你访问他的私有成员。
每日金句:
找一个志同道合,步伐一致的人同行。
如果没有,那就一个人!
————雀儿