- 在类外可以访问公用成员,只有本类中的函数可以访问本类的私有成员
- 友元(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类对象t1Date d1(12,25,2004); //定义Date类对象d1t1.display(d1); //调用t1中的display函数,实参是Date类对象d1return 0;}
3.友元类
- 可以将一个类(例如B类)声明为另一个类(例如A类)的“朋友”。这时B类就是A类的友元类。
- 友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员
