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

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

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

友元

用到關(guān)鍵字 friend

淺解概念

舉一個(gè)非常實(shí)際的例子,假如端午節(jié)到了你煮了兩種粽子,一種是普通的糯米粽子,一種是特殊的五花肉粽子,糯米粽只要是客人都可以品嘗,而五花肉棕只限好朋友品嘗,這時(shí)候就可以用到友元的知識(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)行效果:

普通客人函數(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)行效果:

首先直接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ù)并通過初始化列表完成自動(dòng)賦值,這樣就可以在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對(duì)比,不能訪問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對(duì)比,不能訪問Host類私有成員
{
	cout << "你的好朋友可以吃到你的:" << host->m_Common << endl;
}
void test()
{
	FriendFun F;
	F.visit();
	F.visit0();
}
int main()
{
	test();
}

運(yùn)行效果:

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

注意事項(xiàng)

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

總結(jié)

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    利用C/C++二進(jìn)制讀寫png文件的方法示例

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

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

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

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

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

    C語言版的三子棋游戲

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

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

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

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

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

最新評(píng)論

固始县| 金坛市| 临夏市| 武冈市| 石景山区| 台州市| 平阴县| 高邮市| 来宾市| 登封市| 汉川市| 宾阳县| 波密县| 高台县| 宁津县| 忻州市| 合作市| 星子县| 镇宁| 三亚市| 明光市| 白河县| 潢川县| 乌恰县| 诸城市| 苗栗市| 富宁县| 新昌县| 长宁县| 军事| 南丰县| 尖扎县| 静安区| 株洲市| 乌海市| 伊春市| 罗定市| 榕江县| 阿城市| 唐河县| 彭泽县|