C++友元(1) - 友元类与友元函数

来源:互联网 发布:对阿里云的理解 编辑:程序博客网 时间:2024/05/01 19:51

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 = 0; }    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;}</span>
输出:
B::b = 0

6.全局函数做为友元函数

#include <iostream> class A{    int a;public:    A() {a = 0;}    friend void showA(A&); // 全局友元函数}; void showA(A& x) {    std::cout << "A::a=" << x.a;}int main(){    A a;    showA(a);    return 0;}
输出:
A::a = 0

更多参考:

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

0 0