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

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

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

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

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

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

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

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

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

很明顯,我們只需要重載運算符*即可:

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

我們在使用的時候大概是這樣:

Time a, b;
a = b * 32.5;

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

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

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

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

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

它有兩個含義:

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

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

函數(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)
}

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

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

相關(guān)文章

  • C++超詳細講解模板的使用

    C++超詳細講解模板的使用

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

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

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

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

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

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

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

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

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

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

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

    C++ 類的友元機制解讀

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

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

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

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

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

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

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

最新評論

班戈县| 景泰县| 依兰县| 甘孜| 福海县| 漳浦县| 长垣县| 宁陵县| 黄山市| 新和县| 广西| 南华县| 商南县| 德保县| 太仆寺旗| 朔州市| 马山县| 北海市| 贺兰县| 武城县| 金塔县| 团风县| 探索| 枝江市| 基隆市| 灵宝市| 青州市| 十堰市| 石河子市| 岳普湖县| 左云县| 绥中县| 东乌| 格尔木市| 虞城县| 蒙城县| 伊川县| 富锦市| 历史| 霸州市| 阿合奇县|