一、友元函数
1、友元函数
友元函数不是当前类的成员函数,但它可以访问该类所有的成员,包括私有成员、保护成员和公有成员。
在类中声明友元函数时,需在其函数名前加上关键字 friend。
友元函数既可以是非成员函数,也可以是另一个类的成员函数。
class Date {
public:
Date(int y, int m, int d); //构造函数
friend void showDate1(Date &d); //友元函数
private:
int year;
int month;
int day;
friend void showDate2(Date &d); //友元函数
};
Date::Date(int y, int m, int d) {
year = y;
month = m;
day = d;
}
void showDate1(Date &d) {
cout << d.year << "." << d.month << "." << d.day << endl;
}
void showDate2(Date &d) {
cout << d.year << "." << d.month << "." << d.day << endl;
}
int main() {
Date date1(2009, 11, 14);
showDate1(date1);
showDate2(date1);
return 0;
}
(1) 友元函数不是成员函数,声明可以放在公有部分、保护部分、私有部分,不受影响。
(2) 友元函数不是成员函数。因此,在类的外部定义友元函数时,不能像成员函数那样,在函数名前加上“类名∷”。
(3) 因为友元函数不是类的成员,所以它不能直接调用对象成员,它必须传入对象、对象指针 或 对象引用,来调用该对象的成员。
(4) 一对多,一个函数可以是多个类的友元函数。当一个函数需要访问多个类时,友元函数非常有用。
2、一个普通函数是多个类的友元函数
class Date; //对Date类的提前引用声明
class Time { //声明类Boy
public:
Time(int h,int m,int s)//定义构造函数
{
hour =h;
minute =m;
sec =s;
}
friend void showDate_Time(Date &d,Time &t) ;
private:
int hour;
int minute;
int sec;
};
class Date { //声明类Date
public:
Date(int y,int m,int d)//定义构造函数
{
year=y;
month=m;
day=d;
}
friend void showDate_Time(Date &d,Time &t);
private:
int year;
int month;
int day;
};
void showDate_Time (Date &d,Time &t)
{cout<<d.year<<"."<<d.month<<"."<<d.day<<endl;
cout<< t.hour <<":"<< t.minute <<":"<< t.sec <<endl;
}
int main() {
Date date1(2009,11,14); //定义Date类对象date1
Time time1(6,12,18); //定义Time类对象time1
showDate_Time (date1,time1);
return 0;
}
3、一个类的成员函数作为另一个类的友元函数
class Date; //对Date类的提前引用声明
class Time {
public:
Time (int h,int m,int s) //定义构造函数
{
hour =h;
minute =m;
sec =s;
}
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;
}
friend void Time::showDate_Time(Date &); //友元函数
private:
int year;
int month;
int day;
};
void Time::showDate_Time (Date &d) {
cout << d.year << "." << d.month << "." << d.day << endl;
cout << hour << ":" << minute << ":" << sec << endl;
}
int main() {
Date date1(2009,11,14); //定义Date类对象date1
Time time1(6,12,18); //定义Time类对象time1
time1.showDate_Time(date1);
return 0;
}
类Time的成员函数为类Date的友元函数,必须先定义类Time。
并且在声明友元函数时,要加上成员函数所在类的类名,如: friend void Time::showDate_Time(Date &);
二、C++为什么要引入友元函数
(1) 声明了一个类的友元函数,就可以用这个函数直接访问该类的私有数据,从而提高了程序运行的效率。
(2) 友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。尤其 当一个函数需要访问多个类时,友元函数非常有用。
(3) 引入友元机制的另一个原因是方便编程,在某些情况下,如运算符被重载时,需要用到友元函数。
缺点:破坏了数据的隐蔽性和类的封装性,降低了程序的可维护性,这与面向对象的程序设计思想是背道而驰的。因此使用友元函数应谨慎。
三、友元类
来源:https://blog.csdn.net/weixin_41565755/article/details/100085959