友元函数:
友元函数可以直接访问类的私有成员,它是定义在类外的普通函数,不属于任何类, 但需要在类内通过特殊的方式声明,这里特殊的方式指的就是在类内声明时需加上 friend 关键字
class Date
{
//友元函数的声明
friend ostream& operator <<(ostream& _cout, const Date& d);
public:
Date(int year,int month,int day)
:_year(year)
,_month(month)
,_day(day)
{}
private:
int _year;
int _month;
int _day;
};
//友元函数作为普通函数,再类外的定义
ostream& operator <<(ostream& _cout, const Date& d)
{
_cout << d._year << "-" << d._month << "-" << d._day << endl;
return _cout;
}
void test()
{
Date d(2018, 9, 7);
//想在这里连续输出就必须对上面函数设置返回值
//设置成void 类型,不能连着用<< 运算符
cout << d << endl;
}
说明:
- 友元函数可以访问类的私有成员,但不是类的成员函数
- 友元函数不能用 const 修饰(因为它不是类的成员函数)
- 友元函数在类定义域内的任何地方都可声明,不受类访问限定符的限制
- 一个函数可以是多个类的友元函数
- 友元函数的调用和普通函数的调用原理相同
友元类:
友元类的所有成员函数都可以是另一个类的成员函数,可以访问另一个类中的私有成员
class Time
{
//声明日期类为时间类的友元类
//则在日期类中就直接访问Time类中的私有成员变量
friend class Date;
public:
//Time 类的构造函数需设计成缺省的构造函数
//否则Date类的构造函数没有能力构造出Time类对象
Time(int hour = 12,int minute = 0,int second = 0)
:_hour(hour)
,_minute(minute)
,_second(second)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year,int month,int day)
:_year(year)
,_month(month)
,_day(day)
{}
void SetTime(int hour,int minute,int second)
{
//直接访问时间类私有的成员变量
_t._hour = hour;
_t._minute = minute;
_t._second = second;
}
private:
int _year;
int _month;
int _day;
Time _t;
};
友元的优缺点:
优点:提高了程序运行效率
缺点:破坏了类的封装性和隐藏性
注意:
- 友元关系是单向的,不具有交换性
- 友元关系不能传递