一.友元函数
1.全局友元函数的定义
友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。如下图所示,我们的友元用关键字friend来定义,可以通过定义好的友元函数来访问私有成员,如果printXY不是友元函数编译器会报错!
2.友元成员函数
下图中我们将Cicle类的成员函数声明为Coordinate的友元函数!注意的是我们使用这个函数的时候要先实例化Cicle类。
二.友元类
1.友元类的定义
下图中我们将Circle声明为Coordinate的友元类。注意的是声明一个友元类需要在前面提前声明一下,表示有这个类。那么我们就可以在Circle这个类中去定义一个Coordinate的对象并且可以通过这个对象可以任意的访问Coordinate的私有数据成员和成员函数!
2.友元的注意事项
友元关系不可传递
友元关系的单向性
友元声明的形式及数量不受限制
注意:友元只是封装的补充,并不推荐使用,因为其破坏了封装性。
3.代码示例
#include <iostream>
using namespace std;
class Watch;
/**
* 定义Time类
* 数据成员:m_iHour, m_iMinute,m_iSecond
* 成员函数:构造函数
* 友元类:Watch
*/
class Time
{
// 友元类
friend Watch;
public:
Time(int hour, int min, int sec)
{
m_iHour = hour;
m_iMinute = min;
m_iSecond = sec;
}
private:
int m_iHour;
int m_iMinute;
int m_iSecond;
};
/**
* 定义Watch类
* 数据成员:m_tTime
* 成员函数:构造函数
* display用于显示时间
*/
class Watch
{
public:
Watch(Time &m_tTime):m_tTime(m_tTime){};
void display()
{
cout << m_tTime.m_iHour << endl;
cout << m_tTime.m_iMinute << endl;
cout << m_tTime.m_iSecond << endl;
}
private:
Time m_tTime;
};
int main()
{
Time t(6, 30, 20);
Watch w(t);
w.display();
return 0;
}