友元函数/友元类

引入

当某一类或函数需要访问或使用另一类的私有函数或变量时,引入友元。
例如:
你的银行卡号是私有的,别人不能访问,但你父母要往里存钱,此时需要你的银行卡号对其开放访问,这你的父母便是你的友元。

未引入友元的情况

class A{
public:
        ....
private:
        void Func();
        int field;
}

void UseA(A & a)
{
        a field = 5;              //field为对象a中的私有成员,不能访问,报错
}
int main()
{
      A a;
      UseA(a);
}

友元函数的使用方法

格式

friend 被当作友元的函数或类

例如:

class A{
        friend void UseA(A & a);       //声明友元函数
public:
        ....
private:
        void Func();
        int field;
}
void UseA(A & a)
{
        a.field = 5;       //正常访问调用
        ...
}
int main()
{
        A a;
        UseA(a);
}

友元函数和友元类

  • 友元函数

包括全局函数,和类的成员函数

  • 友元类

包括类的全部成员函数

  • 嵌套类及嵌套的友元类

  • 运算符重载时使用

例子如下

class Parent{
public:
        void addMoney(Wallet & w){
        w.money += 8888;
        }
        void checkMoney(Wallet & w){
        cout<<w.history<<endl;
        }
        void checkCourse(Course & c){
        cout<<c.score<<endl;
        }
};
class Wallet{
friend class Parent;      //友元声明一般放在public和private前面
friend void Parent::AddMoney(Wallet &);  //可以只限定Parent类中的特定函数为友元
private:
        int money;
        int history;
}
class A{
friend const A operator + ( const A & Ihs, const A & rhs);
friend void B::f(A&a);
friend class C;
class D;                  //嵌套类
friend class D;        //声明嵌套类为友元,此时class D能够访问调用A中的成员
private:
        int mValue;
};

补充说明

  • 友元的本质都是友元函数,没有友元数据
  • 友元函数不是类的成员
  • 友元关系是单向的
    即被声明的友元能访问当前类,但当前类不能访问友元。
  • 友元关系没有传递性
    即如果B是A的友元,C是B的友元,则C不是A的友元,C不能访问A的成员。
  • 友元对封装和信息隐蔽的影响:
    • 局部来看,破坏封装及信息隐蔽
    • 全局来看,保护信息(只限定友元能访问私有成员)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279

推荐阅读更多精彩内容