以下内容源于慕课网的学习整理,如有侵权,请告知删除。
一、友元函数
1、分类
全局函数——》友元全局函数
成员函数——》友元成员函数
2、关键字friend
友元全局函数
- 如下,利用friend修饰的函数,其参数应该是本类的引用或者指针;
- 这里的printXY函数写在类的外面,即全局函数。
- 但是可以访问类的私有成员,因为用friend在类中声明了是友元函数。
友元成员函数
- 此时的printXY函数位于类Circle中。
- 此时的printXY可以访问Coordinate中的私有数据成员。
二、友元类
- 概念如下
- 此时可以在友元类Circle中定义一个Coordinate类,然后访问Coordinate的数据成员。
三、关于友元的注意事项
1、友元关系不可传递;
2、友元关系的单向性;
3、友元声明的形式及数量不受限制。(友元声明在类的哪里都可以)
4、友元只是封装的补充,是迫不得已的使用方法,可以通过设计的巧妙性,避免使用友元。它破坏了数据的封装。
四、代码示例
#include <iostream>
using namespace std;
class Watch;/*** 定义Time类* 数据成员:m_iHour, m_iMinute,m_iSecond * 成员函数:构造函数* 友元类:Watch*/
class Time
{// 友元类friend class Watch;
public:Time(int hour, int min, int sec){m_iHour = hour;m_iMinute = min;m_iSecond = sec;}
public:int m_iHour;int m_iMinute;int m_iSecond;
};/*** 定义Watch类* 数据成员:m_tTime* 成员函数:构造函数* display用于显示时间*/
class Watch
{
public:Watch(Time& temp):m_tTime(t){}void display(){cout << m_tTime.m_iHour << endl;cout << m_tTime.m_iMinute << endl;cout << m_tTime.m_iSecond << endl;}
public:Time m_tTime;
};int main()
{Time t(6, 30, 20);Watch w(t);w.display();return 0;
}