友元允许特定的非成员函数能够访问一个类的私有成员,同时阻止一般的访问。通过友元机制,一个类可以将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字friend开始,只能出现在类定义的内部,但可以出现在类中的任何地方,但通常将友元声明成组地放在类定义的开始或结尾。
友元可以是其他的类,普通的非成员函数或其他类的成员函数,下面分别简要介绍。
(1)类作为友元
如果将一个类B声明为另一个类A的友元,那么这个友元类B的成员就可以直接访问A的私有成员,声明的格式如下:
class A { friend class B; }
(2)类的成员函数作为友元
如果不是将整个类设为友元,而是将某个类B的成员函数设为另一个类A的友元函数,那么这个函数就可以访问A的私有成员,但是类B必须先于类A定义,另一方面,必须在定义A之后,B的那个成为友元的成员函数才能定义。代码示例如下:
class B { public: //...
void PrintAMember(int a); }; class A { friend void B::PrintAMember(B::int a); };
(3)非成员函数作为友元
也可以通过将一个普通的非成员函数设为一个类的友元而使其可以访问类的私有成员,如:
class A { friend void f(); };
(4)代码示例
1 /*********Head.h********/ 2 #ifndef HEAD_H 3 #define HEAD_H 4 #include<iostream> 5 using namespace std; 6 #include "Sales_Item.h" 7 8 class Head 9 { 10 public: 11 Head(){ } 12 void PrintSalesItem(const Sales_Item& item) 13 { 14 cout<<item.isbn<<endl; 15 cout<<item.units_sold<<endl; 16 cout<<item.revenue<<endl; 17 } 18 private: 19 int a; 20 int b; 21 }; 22 23 #endif 24 25 /************Head2.h*************/ 26 #ifndef HEAD2_H 27 #define HEAD2_H 28 #include<iostream> 29 using namespace std; 30 31 class Head2 32 { 33 public: 34 Head2() 35 { 36 } 37 void PrintSalesISBN(const Sales_Item& item); 38 39 }; 40 41 #endif 42 43 44 /***************Sales_Item.h**************/ 45 #ifndef SALES_ITEM_H 46 #define SALES_ITEM_H 47 #include<string> 48 #include "Head2.h" 49 50 class Sales_Item 51 { 52 friend Sales_Item Add(const Sales_Item& item1, const Sales_Item& item2); 53 friend class Head; 54 friend void Head2::PrintSalesISBN(const Sales_Item& item); 55 public: 56 Sales_Item(const string& book = "", const unsigned us = 0, double re = 0) 57 :isbn(book),units_sold(us),revenue(re) 58 { 59 60 } 61 Sales_Item(istream& is) 62 { 63 cin>>isbn>>units_sold>>revenue; 64 } 65 private: 66 string isbn; 67 unsigned units_sold; 68 double revenue; 69 }; 70 71 #endif 72 73 74 /**************main.cpp*************/ 75 #include "stdafx.h" 76 #include<iostream> 77 using namespace std; 78 #include<string> 79 #include "Sales_Item.h" 80 #include "Head.h" 81 #include "Head2.h" 82 83 Sales_Item Add(const Sales_Item& item1, const Sales_Item& item2) 84 { 85 Sales_Item temp; 86 temp.isbn = item1.isbn; 87 temp.units_sold = item1.units_sold + item2.units_sold; 88 temp.revenue = item1.revenue + item2.revenue; 89 cout<<temp.units_sold<<endl; 90 return temp; 91 } 92 int _tmain(int argc, _TCHAR* argv[]) 93 { 94 Sales_Item item1("hehe",3,4.12); 95 Sales_Item item2("haha",3,4.13); 96 97 Sales_Item item = Add(item1, item2); 98 99 system("pause"); 100 return 0; 101 }