溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++類和對象中友元函數(shù)怎么使用

發(fā)布時(shí)間:2022-06-07 10:32:33 來源:億速云 閱讀:271 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要介紹“C++類和對象中友元函數(shù)怎么使用”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“C++類和對象中友元函數(shù)怎么使用”文章能幫助大家解決問題。

    友元

    用到關(guān)鍵字 friend

    淺解概念

    舉一個(gè)非常實(shí)際的例子,假如端午節(jié)到了你煮了兩種粽子,一種是普通的糯米粽子,一種是特殊的五花肉粽子,糯米粽只要是客人都可以品嘗,而五花肉棕只限好朋友品嘗,這時(shí)候就可以用到友元的知識了。在程序里,有些私有屬性也想讓類外特殊的一些函數(shù)或者類訪問,就要用到友元函數(shù)。

    友元目的

    讓一個(gè)函數(shù)或者類,訪問另一個(gè)類的私有屬性

    友元的三種實(shí)現(xiàn)

    全局函數(shù)、成員函數(shù)、類都可以做友元。

    全局函數(shù)做友元

    示例:

    class Host    //東家
    {
    	friend void  FriendFunc(Host& H);
    private:
    	string m_Precious;
    public:
    	string m_Common;
    	Host() :m_Precious("五花肉粽"), m_Common("糯米粽") {}
    };
    void VisitFunc(Host &H)
    {
    	cout << "你的  客人可以吃到你的:" << H.m_Common << endl;
    }
    void FriendFunc(Host &H)
    {
    	cout << "你的好朋友可以吃到你的:" << H.m_Precious <<"和"<<H.m_Common<< endl;
    }

    運(yùn)行效果:

    C++類和對象中友元函數(shù)怎么使用

    普通客人函數(shù)沒有權(quán)限訪問Host類的私有屬性m_Precious ,而好朋友函數(shù)在類中加上friend關(guān)鍵字聲明就可以訪問類內(nèi)所有成員屬性。最好寫到類最上面,這樣可以在第一時(shí)間告訴編譯器該全局函數(shù)是該類的友元函數(shù)。

    類做友元

    示例:

    class Host    //東家 類
    {
    	friend class  FriendFunc;
    private:
    	string m_Precious;
    public:
    	string m_Common;
    	Host() :m_Precious("五花肉粽"), m_Common("糯米粽") {}
    };
    class FriendFunc   //好朋友類
    {
    public:
    	Host* host;
    	void visit();
    	FriendFunc();
    };
    void FriendFunc::visit()
    {
    	cout << "你的好朋友可以吃到你的:" << host->m_Precious << "和" << host->m_Common << endl;
    }
    FriendFunc::FriendFunc()
    {
    	host = new Host;
    }
    void test01()
    {
    	FriendFunc F;
    	F.visit();
    }
    int main()
    {
    	test01(); 
    }

    運(yùn)行效果:

    C++類和對象中友元函數(shù)怎么使用

    首先直接copy下來全局函數(shù)做友元的Host類,然后把上面的FriendFunc函數(shù)變?yōu)轭?;同樣在Host類中聲明FirstFunc類是其友元類,然后給友元類定義Host類指針,vist訪問方法和默認(rèn)構(gòu)造函數(shù),這里方法和函數(shù)均在類內(nèi)定義,類外聲明;注意:構(gòu)造函數(shù)的聲明不需要返回值類型。

    友元類的構(gòu)造函數(shù)定義中直接new了一個(gè)Host類,當(dāng)我們調(diào)用友元類的默認(rèn)構(gòu)造同時(shí)調(diào)用Host的默認(rèn)構(gòu)造函數(shù)并通過初始化列表完成自動賦值,這樣就可以在visit函數(shù)中訪問Host類的成員屬性了。使用指針的原因就是new的返回值為指針類型,在堆區(qū)開辟空間。

    成員函數(shù)做友元

    示例:

    #include<iostream>
    using namespace std;
    class Host;
    class FriendFun//好朋友類
    {
    public:
    	FriendFun();
    	Host* host;
    	void visit();   //讓其可以訪問Host類的私有成員
    	void visit0();  //和visit對比,不能訪問Host類私有成員
    };
    class Host           //東家 類
    {
    	friend void FriendFun::visit();
    private:
    	string m_Precious;
    public:
    	string m_Common;
    	Host() :m_Precious("五花肉粽"), m_Common("糯米粽") {}
    };
    FriendFun::FriendFun()
    {
    	host = new Host;
    }
    void FriendFun::visit()   //讓其可以訪問Host類的私有成員
    {
    	cout << "你的好朋友可以吃到你的:" << host->m_Precious << "和" << host->m_Common << endl;
    }
    void FriendFun::visit0()  //和visit對比,不能訪問Host類私有成員
    {
    	cout << "你的好朋友可以吃到你的:" << host->m_Common << endl;
    }
    void test()
    {
    	FriendFun F;
    	F.visit();
    	F.visit0();
    }
    int main()
    {
    	test();
    }

    運(yùn)行效果:

    C++類和對象中友元函數(shù)怎么使用

    成員函數(shù)作為友元和全局函數(shù)作為友元區(qū)別就是函數(shù)聲明的位置不同,同樣在Host類里加上friend關(guān)鍵字即可,但是一定要注意函數(shù)或者方法聲明后定義的位置,死死記住代碼是按照順序執(zhí)行的。

    注意事項(xiàng)

    舉個(gè)例子:如果直接類內(nèi)定義FriendFun的構(gòu)造函數(shù),程序會提示你未定義類型Host,為什么呢,我明明在Host類之前聲明了啊,確實(shí)聲明了,也定義了啊,但是編譯器來不及看到定義就以及執(zhí)行了new Host,肯定會報(bào)錯(cuò);按正確的寫法就是把構(gòu)造函數(shù)定義寫在Host定義之后,這樣程序就把定義的Host看完了,就可以自然而然的生成新的成員了;其實(shí)visit的定義也必須寫在調(diào)用FriendFun構(gòu)造函數(shù)之后,因?yàn)橹挥袠?gòu)造生成了新成員,才能訪問到公共或者私有屬性啊!

    關(guān)于“C++類和對象中友元函數(shù)怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    c++
    AI