文章目录
- 一、友元
- 二、友元函数
- 三、友元类
一、友元
友元分为:友元函数
和友元类
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
二、友元函数
友元可以是一个函数,该函数被称为友元函数;
友元函数可以直接访问类的private成员和protect成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend
关键字。
使用:在函数声明前+
friend
class Box
{double width;
public:double length;friend void printWidth( Box box );void setWidth( double wid );
};
- 友元函数可访问类的私有和保护成员,但不是类的成员函数
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元函数的调用与普通函数的调用原理相同
比如下题
#include<iostream>
using namespace std;class Date
{
public:Date(int year = 0, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//友元函数声明friend bool operator==(const Date& x1,const Date& x2);
private:int _year;int _month;int _day;
};bool operator==(const Date& x1,const Date& x2){return x1._year == x2._year&& x1._month == x2._month&& x1._day == x2._day;}
int main()
{//创建两个对象,并赋初始值Date d1(1919, 9,9);Date d2(1919,9,9);if (d1 == d2) {cout << "true" << endl;}else {cout << "false" << endl;}return 0;
}
为了解决类外函数无法访问类中的私有成员变量,我们只需使用友元函数。
friend
bool operator==(const Date& x1,const Date& x2);写在类中进行一个声明即可。
三、友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
- 友元关系是单向的,不具有交换性。
- 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接
- 访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
- 友元关系不能传递
- 如果C是B的友元, B是A的友元,则不能说明C时A的友元。
- 友元关系不能继承。
class Time
{
friend class Date; {}// 声明日期类为时间类的友元类,则在日期类中就直接访问Time类
中的私有成员变量
}