最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++簡單又輕松的講解類和對象中友元函數(shù)

 更新時間:2022年06月07日 09:19:21   作者:葉落秋白  
采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)

友元

用到關(guān)鍵字 friend

淺解概念

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

友元目的

讓一個函數(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;
}

運行效果:

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

運行效果:

首先直接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了一個Host類,當(dāng)我們調(diào)用友元類的默認(rèn)構(gòu)造同時調(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();
}

運行效果:

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

注意事項

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

總結(jié)

學(xué)習(xí)完這篇快點去定義誰才能獲取你五花肉粽子的特權(quán)吧,挺有意思的??傮w來說友元這塊知識不難,但是一定要注意細(xì)節(jié),我在總結(jié)這里再說一次,代碼一定是按照順序執(zhí)行的,類內(nèi)外定義一定要注意順序,還記得這段知識點,一個bug卡了我兩個小時,希望你們能避開我的坑,順利前行

到此這篇關(guān)于C++簡單又輕松的講解類和對象中友元函數(shù)的文章就介紹到這了,更多相關(guān)C++友元函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)LeetCode(111.二叉樹的最小深度)

    C++實現(xiàn)LeetCode(111.二叉樹的最小深度)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c++11?實現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換問題

    c++11?實現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換問題

    這篇文章主要介紹了c++11?實現(xiàn)枚舉值到枚舉名的轉(zhuǎn)換,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C語言?如何用堆解決Topk問題

    C語言?如何用堆解決Topk問題

    TopK問題即在N個數(shù)中找出最大的前K個,這篇文章將詳細(xì)講解如何利用小根堆的方法解決TopK問題,文中代碼具有一定參考價值,快跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12
  • C++讀取文本文件中的漢字亂碼情況原因及解決

    C++讀取文本文件中的漢字亂碼情況原因及解決

    本文介紹簡體中文Windows操作系統(tǒng)中,C++讀取文本文件中的漢字亂碼情況原因及解決,文中通過代碼和圖文給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-01-01
  • 利用C/C++二進制讀寫png文件的方法示例

    利用C/C++二進制讀寫png文件的方法示例

    最近在做項目的時候遇到了這個問題,所以想著總結(jié)下,方法自己和有需要的朋友,下面這篇文章主要介紹了利用C/C++二進制讀寫png文件的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Qt多線程實現(xiàn)網(wǎng)絡(luò)發(fā)送文件功能

    Qt多線程實現(xiàn)網(wǎng)絡(luò)發(fā)送文件功能

    這篇文章主要為大家詳細(xì)介紹了Qt多線程實現(xiàn)網(wǎng)絡(luò)發(fā)送文件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++實現(xiàn)矩陣對稱正交化的示例代碼

    C++實現(xiàn)矩陣對稱正交化的示例代碼

    這篇文章主要介紹了C++實現(xiàn)矩陣對稱正交化,分為python代碼和C++的eigen庫實現(xiàn)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C語言版的三子棋游戲

    C語言版的三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言版的三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言SetConsoleCursorPosition函數(shù)使用方法

    C語言SetConsoleCursorPosition函數(shù)使用方法

    這篇文章介紹了C語言SetConsoleCursorPosition函數(shù)的使用方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • QT實現(xiàn)FTP上傳文件

    QT實現(xiàn)FTP上傳文件

    這篇文章主要為大家詳細(xì)介紹了QT實現(xiàn)FTP上傳文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

临武县| 广汉市| 灵丘县| 望谟县| 大同市| 抚宁县| 辽宁省| 义马市| 黑水县| 鄂温| 东港市| 闽清县| 泰安市| 雷州市| 涪陵区| 宣汉县| 西安市| 泽库县| 阿拉尔市| 兴化市| 浦东新区| 松原市| 宜春市| 慈溪市| 木兰县| 克什克腾旗| 福海县| 昌乐县| 凉城县| 清河县| 元谋县| 石首市| 盐城市| 新源县| 邵阳市| 泰兴市| 大冶市| 南皮县| 临沧市| 无锡市| 商丘市|