经过一番学习,我知道类中有公有部分和私有部分。关于公有部分,我们是可以在类外进行访问的。但是私有部分却只有在类中才可以进行访问。但是想在类外访问私有部分成员也不是没有办法,那就是——友元(friend)。友元的最大作用也就是——在类外访问类中的私有成员。
友元主要包括两个:友元函数和友元类
#include<iostream> using namespace std; class Time { public: Time(int, int, int); //声明构造函数; friend void display(Time &); //声明友元成员函数display(),其中的Time是声明与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’,这个形参t是Time类对象的引用。 { cout << t.hour << ":" << t.minute << ":" << t.sec << endl; } int main() { Time t1(10, 13, 16); //这里定义一个Time类的t1,并且赋值为hour=10、minute=13,sec=16. display(t1); //这里调用display函数,并将实参t1的值带入形参t。 return 0; }
上述例子是将一个普通函数声明为友元函数,这其实和类的成员函数引用看起来很相似,但是二者有本质上的区别。类的成员函数的引用,是类的内部调用;而友元函数则是在类外调用类中的私有成员,二者看起来虽然有些相似,但是千万不能弄混淆。
将普通函数声明为友元函数使用,虽然是可以的,但是在实际操作中用的不多,大多是直接内部调用即可。而友元函数最大的作用是——在一个类中调用另一个类中的成员函数。
#include<iostream> using namespace std; class Date; class Time { public: Time(int, int, int); void display(Date &); //注意,此display函数属于Time类,但是指向了Date类; private: int hour; int minute; int sec; }; class Date { public: Date(int, int, int); friend void Time::display(Date &); //这里声明了函数display是Date的友元函数,这个函数本身还是在Time类中(可以在这个display函数中调用Date类中的私有成员); private: int month; int day; int year; }; Time::Time(int h, int m, int s) { hour = h; minute = m; sec = s; } Date::Date(int m, int d, int y) { month = m; day = d; year = y; } void Time::display(Date &d) //在使用这个友元函数display时也要特别注意,引用了一个'd'('d'是一个形参); { cout << d.month << "/" << d.day << "/" << d.year << endl; cout << hour << ":" << minute << ":" << sec << endl; } int main() { Time t2(10, 13, 16); Date d2(12, 25, 76); t2.display(d2); //t2引用Time类中的函数display,函数display调用了Date类中的私有成员;
return 0; }
再次点明开头——“友元”的最大作用就是:在类外访问类中的私有部分。