C++中friend的使用(friend function and friend class) .

转自:http://blog.csdn.net/andy_yf/article/details/7062347

对于一个没有定义public访问权限的类,能够让其他的类操作它的私有成员往往是有用的。例如你写了一段binary tree的代码,Node是节点类,如果能够让连接多个节点的函数不需要调用public方法就能够访问到Node的私有成员的话,一定是很方便的。

Friend Classes(友元类)

C++中的friend关键字其实做这样的事情:在一个类中指明其他的类(或者)函数能够直接访问该类中的private和protected成员。

你可以这样来指明:

friend class aClass;

注意:friend在类中的声明可以再public、protected和private的如何一个控制域中,而不影响其效果。例如,如果你在protected域中有这样的声明,那么aClass类同样可以访问该类的private成员。

这有一个例子:

  1. class Node   
  2. {  
  3.     private:   
  4.        int data;  
  5.        int key;  
  6.        // ...  
  7.   
  8.     friend class BinaryTree; // class BinaryTree can now access data directly  
  9. };  
class Node 
{
    private: 
       int data;
       int key;
       // ...

    friend class BinaryTree; // class BinaryTree can now access data directly
};

这样BinaryTree就可以直接访问Node中的private的成员了,就像下面这样:

  1. class BinaryTree  
  2. {  
  3.     private:  
  4.        Node *root;  
  5.   
  6.     int find(int key);  
  7. };  
  8. int BinaryTree::find(int key)  
  9. {  
  10.     // check root for NULL...  
  11.     if(root->key == key)  
  12.     {  
  13.         // no need to go through an accessor function  
  14.         return root->data;  
  15.     }  
  16.     // perform rest of find  
  17. }  
class BinaryTree
{
    private:
       Node *root;

    int find(int key);
};
int BinaryTree::find(int key)
{
    // check root for NULL...
    if(root->key == key)
    {
        // no need to go through an accessor function
        return root->data;
    }
    // perform rest of find
}

Friend Functions(友元函数)

友元函数和友元类的作用是一样的,它允许一个函数不需要通过其public接口就能够访问到类中的private和protected成员变量。

你可以这样去声明:

friend return_type class_name::function(args);

这里有一个例子:

class Node 
{
    private: 
       int data;
       int key;
       // ...

    friend int BinaryTree::find(); // Only BinaryTree's find function has access
};

这样find方法就可以直接访问Node中的私有成员变量了,而BinaryTree中的其他的方法去不能够直接的访问Node的成员变量。(这就是友元类和友元函数的区别)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值