C++友元(友元函数和友元类)
时间:2014-10-29 19:02 点击:次
在一个类中可以有公用的(public )成员和私有的(private )成员,在类外可以访问公用成员,只有本类中的函数可以访问本类的私有成员。现在,我们来补充介绍一个例外——友元(friend )。
fnend的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些。有的 家庭可能会这样处理:客厅对所有来客开放,而卧室除了本家庭的成员可以进人以外,还 允许好朋友进入。在C++中,这种关系以关键宇friend声明,中文多译为友元。友元可以访问与其有好友关系的类中的私有成员,友元包括友元函数和友元 类。如果您对友元这个名词不习惯,可以按原文friend理解为朋友即可。
友元函数
如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在类体中用friend对其进行声明,此函数就称为本类的友元函数。友元函数可以访问这个类中的私有成员。1) 将普通函数声明为友元函数
通过下面的例子可以了解友元函数的性质和作用。
[例9.12] 友元函数的简单例子。
- #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);
- return 0; //调用display函数,实参t1是Time类对象
- }
- #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) //display的作用是输出年、月、日和时、分、秒
- {
- 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;
- }
- 在函数名display的前面要加display所在的对象名(t1);
- display成员函数的实参是Date类对象d1,否则就不能访问对象d1中的私有数据;
- 在Time::display函数中引用Date类私有数据时必须加上对象名,如d.month。
友元类
不仅可以将一个函数声明为一个类的“朋友”,而且可以将一个类(例如B类)声明为另一个类(例如A类)的“朋友”。这时B类就是A类的友元类。 友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。在A类的定义体中用以下语句声明B类为其友元类: friend B; 声明友元类的一般形式为: friend 类名; 关于友元,有两点需要说明:- 友元的关系是单向的而不是双向的。如果声明了 B类是A类的友元类,不等于A类是B类的友元类,A类中的成员函数不能访问B类中的私有数据。
- 友元的关系不能传递,如果B类是A类的友元类,C类是B类的友元类,不等于 C类是A类的友元类。例如,张三的好友是李四,而李四有好友王五,显然,王五不一定是张三的好友。如果想让C类是A类的友元类,应在A类中另外声明。
顶一下
(2)
100%
踩一下
(0)
0%
上一篇:C++静态成员函数
下一篇:C++类模板详解
相关内容:
最新内容
热点内容
- QQ群
-
微信
- 返回首页
- 返回顶部