C++ 友元
C++中存在一种朋友关系,这种朋友关系如果体现在函数上,那么我们就称之为友元函数;如果体现在类上,我们就称之为友元类。
1.友元函数
友元函数是指某些虽然不是类成员函数却能够访问类的所有成员的函数。类授予它的友元特别的访问权,这样该友元函数就能访问到类中的所有成员。
1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 public: 8 friend void set_show(int x, A &a); //该函数是友元函数的声明 9 private: 10 int data; 11 }; 12 13 void set_show(int x, A &a) //友元函数定义,为了访问类A中的成员 14 { 15 a.data = x; 16 cout << a.data << endl; 17 } 18 int main(void) 19 { 20 class A a; 21 22 set_show(1, a); 23 24 return 0; 25 }
2、友元类
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。
关于友元类的注意事项:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 public: 8 friend class C; //这是友元类的声明 9 private: 10 int data; 11 }; 12 13 class C //友元类定义,为了访问类A中的成员 14 { 15 public: 16 void set_show(int x, A &a) { a.data = x; cout<<a.data<<endl;} 17 }; 18 19 int main(void) 20 { 21 class A a; 22 class C c; 23 24 c.set_show(1, a); 25 26 return 0; 27 }
友元小结:
在需要允许某些特定的非成员函数访问一个类的私有成员(及受保护成员),而同时仍阻止一般的访问的情况下,友元是可用的。
优点:
可以灵活地实现需要访问若干类的私有或受保护的成员才能完成的任务;
便于与其他不支持类概念的语言(如C语言、汇编等)进行混合编程;
通过使用友元函数重载可以更自然地使用C++语言的IO流库。
缺点:
一个类将对其非公有成员的访问权限授予其他函数或者类,会破坏该类的封装性,降低该类的可靠性和可维护性。