【C++】类和对象--友元机制 目录友元函数友元类封装性要求私有成员对外隐藏但有时又需要给予特定外部函数或类访问特权。C用friend关键字提供了一种有控制的封装突破方式——友元。友元函数在类内部使用friend关键字声明的外部函数称为该类的友元函数。它的特征如下不是类的成员函数但是可以访问类的私有和保护成员。没有this指针不能使用const修饰const修饰成员函数本质是修饰this。可以在类内部的任何位置声明不受访问限定符影响。一个典型的应用场景是重载流插入operator和流提取operator。因为这两个运算符的左操作数是ostream或istream若重载为成员函数左操作数只能是本类对象就必须写成d cout不符合习惯。因此将它们重载为全局函数并在类中声明为友元以访问私有成员。classDate{friendostreamoperator(ostreamout,constDated);friendistreamoperator(istreamin,Dated);public:Date(intyear1900,intmonth1,intday1):_year(year),_month(month),_day(day){}private:int_year,_month,_day;};ostreamoperator(ostreamout,constDated){outd._year年d._month月d._day日;returnout;}istreamoperator(istreamin,Dated){ind._yeard._monthd._day;returnin;}使用友元时需谨慎它增加了类与外界的耦合。只在确实需要直接访问私有成员时使用例如运算符重载、紧密相关的辅助功能等。友元类一个类可以将另一个类声明为自己的友元类此时友元类的所有成员函数都可以访问该类的私有和保护成员。classTime{friendclassDate;// Date 可以访问 Time 的私有成员public:Time(inthour0,intminute0,intsecond0):_hour(hour),_minute(minute),_second(second){}private:int_hour,_minute,_second;};classDate{public:Date(intyear1,intmonth1,intday1){_t._hour;// 直接访问 Time 的私有成员}voidSetTimeOfDate(inthour,intminute,intsecond){_t._hourhour;_t._minuteminute;_t._secondsecond;}private:int_year,_month,_day;Time _t;};友元关系的几个特点单向性上述例子中Date可以访问Time的私有成员反之不行。不可传递若A是B的友元B是C的友元A并不是C的友元。不可继承友元关系不会被子类继承。友元打破了封装应该“少而精”。在需要高内聚但又有少量外部需要深度协作的场景下它是最佳选择。