- 在类外可以访问公用成员,只有本类中的函数可以访问本类的私有成员
- 友元(friend)可以访问与其有好友关系的类中的私有成员
- 友元包括友元函数和友元类
1.友元函数
- 如果在本类以外的其他地方定义了一个函数,在类体中可
以用friend对其进行声明,此函数就称为本类的友元函数
友元函数可以访问这个类中的私有成员
//将普通函数声明为友元函数
#include <iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);
friend void display(Time &); //声明display函数为Time类的友元函数
private: //以下数据是私有数据成员
int hour;
int minute;
int sec;
};
Time∷ Time(int h,int m,int s) //构造函数,给hour,minute,sec赋初值
{
hour=h;
minute=m;
sec=s;
}
void display(Time& t) //友元函数,形参t是Time类对象的引用
{cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;}
int main( )
{
Time t1(10,13,56);
display(t1);
//调用display函数,实参t1是Time类对象
return 0;
}
注意friend函数在引用私有数据成员时,必须加上对象名,不能写成
cout<<hour<<″:″<<minute<<″:″<<sec<<endl;
因为display函数不是Time类的成员函数,不能默认引用Time类的数据
成员,必须指定要访问的对象
2.友元成员函数
- friend函数也可以是另一个类中的成员函数
//友元成员函数的简单应用
#include <iostream>
using namespace std;
class Date; //对Date类的提前引用声明
class Time //定义Time类
{
public:
Time(int,int,int);
void display(Date &); //display是成员函数,形参是Date类对象的引用
private:
int hour;
int minute;
int sec;
};
class Date //声明Date类
{
public:
Date(int,int,int);
friend void Time∷ display(Date &); //声明Time中的display函数为友元
成员函数
private:
int month;
int day;
int year;
};
Time∷ Time(int h,int m,int s) //类Time的构造函数
{
hour=h;
minute=m;
sec=s;
}
void Time∷ display(Date &d) //输出年、月、日和时、分、秒
{cout<<d.month<<″/″<<d.day<<″/″<<d.year<<endl;
//引用Date类对象中的私有数据
cout<<hour<<″:″<<minute<<″:″<<sec<<endl;
//引用本类对象中的私有数据
}
Date∷ Date(int m,int d,int y) //类Date的构造函数
{
month=m;
day=d;
year=y;
}
int main( )
{
Time t1(10,13,56); //定义Time类对象t1
Date d1(12,25,2004); //定义Date类对象d1
t1.display(d1); //调用t1中的display函数,实参是Date类对象d1
return 0;
}
3.友元类
- 可以将一个类(例如B类)声明为另一个类(例如A类)的“朋友”。这时B类就是A类的友元类。
- 友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员