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

目录

1.Friend Class (友元类)

2.Friend Function (友元函数)

3.友元类与友元函数的一些重要概念

4.友元类的访问

5.成员函数做为友元函数

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


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值