对友元函数和友元类进行了一些整理:
一、关于友元函数的定义:
友元函数可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。
二、友元函数的特点:
友元函数不是当前类的成员函数,但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。
友元函数可以定义在类内,也可以定义在类外。
三、友元函数的分类
1、将非成员函数声明为友元函数
#include <iostream>
using namespace std;
class Date{
public:
Date (int y,int m,int d);
friend void showDate(Date&); //声明函数showDate为友元函数
}
...
Void showDate (Date& d)
{
...
}
...
这时友元函数的访问原则是:友元函数不是类的成员函数,所以不能直接访问对象的数据成员,必须通过对象名来访问该对象的数据成员。
引友元提高了程序的运行效率,实现了类之间的数据共享,方便编程。
2、将成员函数声明为友元函数
一个类的成员函数也可以作为另一个类的友元,成为友元成员函数。友元成员函数不仅可以访问自己所在类对象中的私有和公有成员,还可以访问访问friend声明语句所在类对象中的成员。
#include<iostream>
using namespace std;
class Time {
public:
...
void showDate_Time(Date&);
...
}
class Date{
public:
Date(int y,int m, int d)
...
friend void Time :: showDate_Time (Date&);
}
void Time::showDate_Time (Date& d)
{
}
//友元函数,函数showDate_Time 可以访问Date类对象中的私有成员数据
//成员函数,函数showDate_Time 可以访问Time类对象中的私有数据
四、友元类
定义:将一个类定义为也可以定义为友元类
如:在X类中加入friend Y类,则这时的Y类就是X类的友元类
这意味着Y类中的所有函数都可以访问X类中的所有成员(包括私有成员)
注意:(1)友元关系是单向的,不具有交换性。如声明了类X是类Y的友元,不等于类Y一定是X的友元。
(2)友元不具有传递性,若类X是类Y的友元,类Y是类Z的友元,不一定类X是类Z的友元。必须在类Z中声明。