目录
1.Friend Class (友元类)
一个友元类可以访问声明它的类中的私有和保护成员。在需要指定某个类访问另一个类的私有成员时,友元类会很有用。
例如:一个链表类可能会被允许访问Node类中的私有成员。
class Node
{
private:
int key;
Node *next;
friend class LinkedList; //链表可以访问Node的私有数据
};
2.Friend Function (友元函数)
与友元类相似,友元函数可以访问私有和保护成员。
一个友元函数可以定义为下面情形之一:
a) 另一个类的成员方法
b) 全局函数
class Node
{
private:
int key;
Node *next;
friend int LinkedList::search(); //只有linkedList中的search函数,才能访问Node的私有数据。
};
3.友元类与友元函数的一些重要概念
1) 友元只能被有限制的使用。如果太多的使用友元,则违反了面向对象编程中的封装原则。
2) 友元不是相互作用的。如果A是B的友元,B不一定是A的友元。
3) 友元不能继承。
4) Java没有友元。
4.友元类的访问
#include <iostream>
class A {
private:
int a;
public:
A() { a = 11; }
friend class B; // 友元类
};
class B {
private:
int b;
public:
void showA(A& x) {
// 因为B是A的友元类,所以可以访问A的私有成员a
std::cout << "A::a = " << x.a;
}
};
int main() {
A a;
B b;
b.showA(a);
return 0;
}
运行结果:
A::a = 11
5.成员函数做为友元函数
#include<iostream>
class B;
class A {
public:
void showB(B&);
};
class B {
private:
int b;
public:
B() { b = 666; }
friend void A::showB(B& x); // 友元函数
};
void A::showB(B& x) {
// 因为show() 是B的友元函数,故它可以访问B的私有成员b
std::cout << "B::b = " << x.b;
}
int main() {
A a;
B x;
a.showB(x);
return 0;
}
运行结果:
B::b = 666
6.全局函数做为友元函数
#include <iostream>
class A {
int a;
public:
A() { a = 666; }
friend void showA(A&); // 全局友元函数
};
void showA(A& x) {
std::cout << "A::a=" << x.a;
}
int main() {
A a;
showA(a);
return 0;
}
运行结果:
A::a = 666
更多参考:
http://en.wikipedia.org/wiki/Friend_class
http://en.wikipedia.org/wiki/Friend_function
http://www.cprogramming.com/tutorial/friends.html
http://www.parashift.com/c++-faq/friends-and-encap.html