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

C++中友元函數(shù)(friend)解析

 更新時(shí)間:2022年01月03日 15:21:57   作者:?梁唐  
這篇文章主要分享了C++友元函數(shù)講解,C++提供了一種形式的訪問權(quán)限,叫做友元,友元有三種,分別是友元函數(shù)、友元類和友元成員函數(shù),下面將詳細(xì)介紹該內(nèi)容,需要的小伙伴可以參考一下

 文章轉(zhuǎn)自公眾號:Coder梁(ID:Coder_LT)

我們知道C++控制對象的私有部分的訪問,只能通過公共的接口。這樣的設(shè)計(jì)當(dāng)然沒錯(cuò),但有的時(shí)候也會顯得過于嚴(yán)格,產(chǎn)生一些問題。

因此C++提供了另外一種形式的訪問權(quán)限,叫做友元(friend)。

友元有三種,分別是友元函數(shù)、友元類和友元成員函數(shù)。

通過讓函數(shù)成為類的友元,可以賦予該函數(shù)與類成員函數(shù)一樣的訪問權(quán)限,也就是說我們可以在友元函數(shù)當(dāng)中訪問類的私有成員變量。

在介紹友元函數(shù)的使用之前,我們需要先了解為什么需要友元函數(shù)。C++ Primer中給了一個(gè)非常不錯(cuò)的例子,在之前運(yùn)算符重載的例子當(dāng)中,我們實(shí)現(xiàn)了一個(gè)類Time。用來記錄時(shí)間,假設(shè)我們需要重載它的*運(yùn)算符,能夠允許一個(gè)時(shí)間對象和一個(gè)浮點(diǎn)數(shù)相乘。

很明顯,我們只需要重載運(yùn)算符*即可:

Time Time::operator*(const double x) {
? ? // todo
}

我們在使用的時(shí)候大概是這樣:

Time a, b;
a = b * 32.5;

但是這里有一個(gè)小問題,我們寫成a = b * 32.5;可以,但如果反過來寫成32.5 * b就不行了。因?yàn)閷τ?code>b * 32.5來說本質(zhì)上是b調(diào)用了operator*函數(shù),等價(jià)于a = b.opeartor*(32.5);。但后者就不行了,要怎么解決呢,只能另外實(shí)現(xiàn)一個(gè)函數(shù)來解決了,這個(gè)函數(shù)有兩個(gè)input,分別是doubleTime類型,返回一個(gè)Time類型。

Time operator*(double m, const Time &t);

但這又有了新的問題,由于這不是一個(gè)成員函數(shù),不能直接訪問類的私有數(shù)據(jù)。為了破例讓它能夠訪問,我們需要將它設(shè)置成友元。

創(chuàng)建友元的方法很簡單,我們只需要在函數(shù)簽名之前加上關(guān)鍵字friend。

friend Time operator*(double m, const Time &t);

它有兩個(gè)含義:

  • 它不是成員函數(shù),因此不能使用成員函數(shù)運(yùn)算符來調(diào)用
  • 它與成員函數(shù)的訪問權(quán)限相同,即可以訪問所有privatepublic數(shù)據(jù)

由于友元函數(shù)不是成員函數(shù),所有我們在實(shí)現(xiàn)的時(shí)候不需要使用Time::限定符,也不用在實(shí)現(xiàn)當(dāng)中加上關(guān)鍵字friend,

函數(shù)的實(shí)現(xiàn)如下:

Time operator*(double m, const Time &t) {
? ? Time result;
? ? long totalminutes = t.hours * m * 60 + t.minutes * m;
? ? result.hours = totalminutes / 60;
? ? result.minutes = totalminutes % 60;
? ? return result;
}

我們在函數(shù)當(dāng)中直接訪問了hoursminutes成員變量,因此函數(shù)必須是友元函數(shù)。

當(dāng)然我們可以把函數(shù)稍微變換一下,就可以不必是友元函數(shù)了:

Time operator*(double m, const Time &t) {
? ? return t * m; // ?調(diào)用了t.operator*(m)
}

在這個(gè)函數(shù)當(dāng)中,我們沒有顯式地訪問私有變量,因此可以不必是友元。

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

相關(guān)文章

  • C++超詳細(xì)講解模板的使用

    C++超詳細(xì)講解模板的使用

    這篇文章主要介紹了C++中模板(Template)的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析

    C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析

    這篇文章主要介紹了C++設(shè)計(jì)模式編程中的迭代器模式應(yīng)用解析,迭代器模式注重對集合中元素的遍歷而不使其暴露,需要的朋友可以參考下
    2016-03-03
  • 一文帶你了解C++中的右值引用與移動語義

    一文帶你了解C++中的右值引用與移動語義

    本篇文章主要為大家詳細(xì)介紹了C++中的右值引用與移動語義的相關(guān)知識,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2023-03-03
  • 利用C語言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    利用C語言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了2個(gè)函數(shù),分別是sprintf和sscanf,可以用來實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • C語言中隱藏結(jié)構(gòu)體的細(xì)節(jié)

    C語言中隱藏結(jié)構(gòu)體的細(xì)節(jié)

    以筆者粗淺的認(rèn)識,有兩種最常用的方法,可以實(shí)現(xiàn)庫內(nèi)結(jié)構(gòu)體定義的隱藏:接口函數(shù)形參使用結(jié)構(gòu)體指針,接口函數(shù)形參使用句柄。
    2017-05-05
  • C++虛繼承原理與類布局深度分析

    C++虛繼承原理與類布局深度分析

    這篇文章主要介紹了C++虛繼承原理與類布局分析,本文的目標(biāo)是探究虛繼承的實(shí)現(xiàn)方式和類布局(Class Layout)的具體規(guī)則,需要的朋友可以參考下
    2024-04-04
  • C++ 類的友元機(jī)制解讀

    C++ 類的友元機(jī)制解讀

    這篇文章主要介紹了C++ 類的友元機(jī)制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例

    QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例

    下面小編就為大家?guī)硪黄猀T網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時(shí)通信實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Qt網(wǎng)絡(luò)編程之TCP通信及常見問題

    Qt網(wǎng)絡(luò)編程之TCP通信及常見問題

    這篇文章主要為大家詳細(xì)介紹了Qt網(wǎng)絡(luò)編程之TCP通信及常見問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言中enum關(guān)鍵字的實(shí)現(xiàn)示例

    C語言中enum關(guān)鍵字的實(shí)現(xiàn)示例

    這篇文章主要介紹了C語言中enum關(guān)鍵字的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

宜君县| 合阳县| 邢台市| 碌曲县| 桂阳县| 正蓝旗| 远安县| 大足县| 佛坪县| 新竹县| 斗六市| 天津市| 隆德县| 白玉县| 若尔盖县| 大庆市| 关岭| 昌都县| 五指山市| 安宁市| 黄石市| 五常市| 临猗县| 大港区| 永春县| 阳曲县| 都江堰市| 苍溪县| 贺兰县| 德庆县| 四子王旗| 咸阳市| 昌平区| 商丘市| 邢台县| 东乌珠穆沁旗| 南投县| 长阳| 利辛县| 望城县| 九龙城区|