加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

C++ 友元关系介绍

发布时间:2021-11-20 15:43:32 所属栏目:教程 来源:互联网
导读:在C++中,在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问,这是很方便做到的。例如,被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。这些操作符不可能为类的成员。然而,尽管不是类的成员,它们仍是

在C++中,在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问,这是很方便做到的。例如,被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。这些操作符不可能为类的成员。然而,尽管不是类的成员,它们仍是类的“接口的组成部分”。
 
而友元机制,允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。
 
下面给出C++中所有有关友元的结论和限制,然后后面针对每个细节给出示例:
 
1,友元关系:
 
1.1,将一个非成员函数 reset( ) 声明为类 example 的友元函数,使得该非成员函数可以访问类 example 的私有成员。
 
class example; // 这里必须对类 example 做前向声明,否则下面的函数声明将报错
void reset(example &e);
 
class example
{
public:
    friend void reset(class example &e);
private:
    int n;
};
 
// 该函数定义必须放在类 example 的后面,否则无法解析变量n
void reset(example &e)
{
    e.n = 0;
}
 
1.2,将类man声明为类woman的友元类,使得可以通过类man对象访问类woman的私有成员。
 
class woman; // 前向声明
 
class man
{
public:
    void disp(woman &w);
    void reset(woman &w);
};
 
class woman
{
public:
    friend class man; // 将man设为woman的友元类,这样man对象的任何成员函数都可以访问woman的私有成员
private:
    string name;
};
 
void man::disp(woman &w)
{
    cout << w.name << endl;
}
 
void man::reset(woman &w)
{
    w.name.clear();
}
 
1.3,将一个类man的成员函数disp()声明为类woman的友元函数,使得可以通过disp成员函数访问类woman的私有成员。
 
class woman; // 前向声明
 
class man
{
public:
    void disp(woman &w);
    void reset(woman &w);
};
 
class woman
{
public:
    friend void man::disp(woman &w); // 将man的其中一个成员函数disp()设为woman的友元函数,就可以使用该函数访问woman对象的私有成员了
 
private:
    string name;
};
 
void man::disp(woman &w)
{
    cout << w.name << endl;
}
 
// man的reset()成员函数不是woman类的友元函数,因此不能访问其私有成员
/*
void man::reset(woman &w)
{
    w.name.clear();
}
*/

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读