在介绍友元函数前,先介绍一些概念
公用(public)的成员:在类外可以访问
私有(private)成员:只有本类中的函数可以访问
友元(friend):友元可以访问与其有好友关系的类中的私有成员——有限制的共享
友元包括友元函数和友元类
友元函数:如果在本类以外的其它地方定义的函数,在类体中用friend进行声明,此函数称为类的友元函数,友元函数可以访问这个类中的私有成员
友元类:将一个类声明为另一个类的友元类,友元类B中的所有函数都是A类的友元函数,可以访问A类的所有成员
友元函数程序实例:
#include <iostream> using namespace std; class Time { public: //构造函数 Time(int h, int m, int s); //声明display函数为Time类的友元函数 friend void display(Time &); private: int hour; int minute; int sec; }; //构造函数 Time::Time(int h, int m, int s) { hour = h; minute = m; sec = s; } //友元函数,t是Time类对象的引用 void display(Time &t) { cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; } void main1() { Time t1(10,13,56); display(t1); system("pause"); }
执行结果:
友元类程序实例:
#include <iostream> using namespace std; class Date; class Time { public: //使用初始化表初始化数据成员 Time(int h, int m, int s):hour(h),minute(m),sec(s){} void display(Date &); private: int hour; int minute; int sec; }; class Date { public: //使用初始化表初始化Date类 Date(int m, int d, int y):month(m),day(d),year(y){} friend void Time::display(Date &); private: int month; int day; int year; }; void Time::display(Date & d) { cout<<d.year<<"/"<<d.month<<"/"<<d.day<<endl; cout<<hour<<":"<<minute<<":"<<sec<<endl; } void main() { Time t1(10,13,56); Date d1(12,25,2004); t1.display(d1); system("pause"); }
程序执行结果:
友元的性质:
友元关系是单向而不是双向的
友元关系不能传递
除非确有必要,一般并不把整个类声明为友元类
使用友元的优势:有助于数据共享,能提高程序的效率
使用友元的劣势:友元可以访问其他类中的私有成员,是对封装原则的破坏,不利于信息隐藏
原文:http://blog.csdn.net/u010105970/article/details/28601065