2001.C++BASE-friend(友元)

轉(zhuǎn):關(guān)于C++中的友元函數(shù)的總結(jié)

1.友元函數(shù)的簡(jiǎn)單介紹

1.1為什么要使用友元函數(shù)

在實(shí)現(xiàn)類之間數(shù)據(jù)共享時(shí)郎嫁,減少系統(tǒng)開銷,提高效率祈噪。如果類A中的函數(shù)要訪問類B中的成員(例如:智能指針類的實(shí)現(xiàn))泽铛,那么類A中該函數(shù)要是類B的友元函數(shù)离赫。具體來說:為了
使其他類的成員函數(shù)直接訪問該類的私有變量贺归。即:允許外面的類或函數(shù)去訪問類的私有變量和保護(hù)變量纹安,從而使兩個(gè)類共享同一函數(shù)蚯窥。

實(shí)際上具體大概有下面兩種情況需要使用友元函數(shù):

  • (1)運(yùn)算符重載的某些場(chǎng)合需要使用友元瑰剃。
  • (2)兩個(gè)類要共享數(shù)據(jù)的時(shí)候仇穗。

1.2使用友元函數(shù)的優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):能夠提高效率腮郊,表達(dá)簡(jiǎn)單狱庇、清晰宁赤。
  • 缺點(diǎn):友元函數(shù)破環(huán)了封裝機(jī)制舀透,盡量不使用成員函數(shù),除非不得已的情況下才使用友元函數(shù)决左。

2.友元函數(shù)的使用

2.1 友元函數(shù)的參數(shù)

因?yàn)橛言瘮?shù)沒有this指針愕够,則參數(shù)要有三種情況:

  • 訪問非static成員時(shí)走贪,需要對(duì)象做參數(shù)
  • 要訪問static成員或全局變量時(shí)惑芭,則不需要對(duì)象做參數(shù)坠狡;
  • 如果做參數(shù)的對(duì)象是全局對(duì)象,則不需要對(duì)象做參數(shù)遂跟;

2.2 友元函數(shù)的位置

因?yàn)?strong>友元函數(shù)是類外的函數(shù)逃沿,所以它的聲明可以放在類的私有段或公有段且沒有區(qū)別。

2.3 友元函數(shù)的調(diào)用

可以直接調(diào)用友元函數(shù)漩勤,不需要通過對(duì)象或指針

2.4 友元函數(shù)的分類

根據(jù)這個(gè)函數(shù)的來源不同感挥,可以分為三種方法:

2.4.1 普通函數(shù)友元函數(shù)

  • 目的:使普通函數(shù)能夠訪問類的友元

  • 語法:
    聲明:** friend + 普通函數(shù)聲明**
    實(shí)現(xiàn)位置:可以在類外或類中
    實(shí)現(xiàn)代碼:與普通函數(shù)相同
    調(diào)用:類似普通函數(shù),直接調(diào)用

  • 代碼:

class INTEGER
 {
  friend void Print(const INTEGER& obj);//聲明友元函數(shù)
 };
void Print(const INTEGER& obj)
{
   //函數(shù)體
}
void main()
{
  INTEGER obj;
  Print(obj);//直接調(diào)用
}

2.4.2 類Y的所有成員函數(shù)都為類X友元函數(shù)—友元類

  • 目的:使用單個(gè)聲明使Y類的所有函數(shù)成為類X的友元越败,它提供一種類之間合作的一種方式触幼,使類Y的對(duì)象可以具有類X和類Y的功能。

  • 語法:
    聲明位置:公有私有均可究飞,常寫為私有(把類看成一個(gè)變量)
    聲明:** friend + 類名(不是對(duì)象哦)**

  • 代碼:

class girl;
class boy
{
public:
  void disp(girl &);
};
void boy::disp(girl &x) //函數(shù)disp()為類boy的成員函數(shù)置谦,也是類girl的友元函數(shù)
{
  cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成員函數(shù)disp中亿傅,借助girl的對(duì)象媒峡,直接訪問girl的私有變量
}
class girl
{
private:
  char *name;
  int age;
  friend boy; //聲明類boy是類girl的友元
};

main函數(shù)就不寫了和普通調(diào)用時(shí)一樣的。

2.4.3 類Y的一個(gè)成員函數(shù)為類X的友元函數(shù)

  • 目的:使類Y的一個(gè)成員函數(shù)成為類X的友元葵擎,具體而言:在類Y的這個(gè)成員函數(shù)中谅阿,借助參數(shù)X,可以直接以X的私有變量

  • 語法:
    聲明位置:聲明在公有中 (本身為函數(shù))
    聲明:friend + 成員函數(shù)的聲明
    調(diào)用:先定義Y的對(duì)象y---使用y調(diào)用自己的成員函數(shù)---自己的成員函數(shù)中使用了友元機(jī)制

  • 代碼:
    實(shí)現(xiàn)代碼和2.4.2中的實(shí)現(xiàn)及其相似只是設(shè)置友元的時(shí)候變?yōu)閒riend void boy::disp(girl &);自己解決嘍……

小結(jié):其實(shí)一些操作符的重載實(shí)現(xiàn)也是要在類外實(shí)現(xiàn)的酬滤,那么通常這樣的話签餐,聲明為類的友元是必須滴。

4.友元函數(shù)和類的成員函數(shù)的區(qū)別

  • 成員函數(shù)有this指針盯串,而友元函數(shù)沒有this指針氯檐。
  • 友元函數(shù)是不能被繼承的,就像父親的朋友未必是兒子的朋友体捏。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冠摄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子几缭,更是在濱河造成了極大的恐慌河泳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奏司,死亡現(xiàn)場(chǎng)離奇詭異乔询,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)韵洋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門竿刁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搪缨,你說我怎么就攤上這事食拜。” “怎么了副编?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵负甸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我痹届,道長(zhǎng)呻待,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任队腐,我火速辦了婚禮蚕捉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柴淘。我一直安慰自己迫淹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布为严。 她就那樣靜靜地躺著敛熬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪第股。 梳的紋絲不亂的頭發(fā)上应民,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音夕吻,去河邊找鬼诲锹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梭冠,可吹牛的內(nèi)容都是我干的辕狰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼控漠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔓倍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盐捷,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤偶翅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后碉渡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聚谁,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年滞诺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了形导。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片环疼。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朵耕,靈堂內(nèi)的尸體忽然破棺而出炫隶,到底是詐尸還是另有隱情,我是刑警寧澤阎曹,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布伪阶,位于F島的核電站,受9級(jí)特大地震影響处嫌,放射性物質(zhì)發(fā)生泄漏栅贴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一熏迹、第九天 我趴在偏房一處隱蔽的房頂上張望檐薯。 院中可真熱鬧,春花似錦癣缅、人聲如沸厨剪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祷膳。三九已至,卻和暖如春屡立,著一層夾襖步出監(jiān)牢的瞬間直晨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工膨俐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勇皇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓焚刺,卻偏偏與公主長(zhǎng)得像敛摘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乳愉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 重新系統(tǒng)學(xué)習(xí)下C++兄淫;但是還是少了好多知識(shí)點(diǎn);socket蔓姚;unix捕虽;stl;boost等坡脐; C++ 教程 | 菜...
    kakukeme閱讀 19,826評(píng)論 0 50
  • 前言 人生苦多泄私,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin晌端? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,163評(píng)論 9 118
  • 文 搬磚哥 《打工斩松、掙錢》 清晨 手上的傷口還在疼 疲倦的四肢還沒有醒 而我起床準(zhǔn)備上班 六點(diǎn)的天空沒有太陽 塔吊...
    一枚搬磚哥閱讀 337評(píng)論 2 10
  • 總覺得愛情離我很遠(yuǎn)伶唯。20歲的我不會(huì)和男生聊天觉既,沒有一個(gè)異性朋友惧盹。當(dāng)宿舍姑娘說男朋友拉著她的手時(shí),我才猛然意識(shí)到愛情...
    久發(fā)舞閱讀 243評(píng)論 1 1