欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

我們知道C++控制對象的私有部分的訪問,只能通過公共的接口。這樣的設(shè)計當(dāng)然沒錯,但有的時候也會顯得過于嚴(yán)格,產(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++?Qt數(shù)據(jù)庫與SqlTableModel組件應(yīng)用教程

    C/C++?Qt數(shù)據(jù)庫與SqlTableModel組件應(yīng)用教程

    SqlTableModel?組件可以將數(shù)據(jù)庫中的特定字段動態(tài)顯示在TableView表格組件中,這篇文章將主要介紹SqlTableModel組件一些常用的操作,需要的朋友可以參考一下
    2021-12-12
  • C語言實現(xiàn)24點問題詳解

    C語言實現(xiàn)24點問題詳解

    24點問題就是在屏幕上輸入1?10范圍內(nèi)的4個整數(shù)(可以有重復(fù)),對它們進(jìn)行加、減、乘、除四則運算后(可以任意的加括號限定計算的優(yōu)先級),尋找計算結(jié)果等于24的表達(dá)式。本文將通過C語言實現(xiàn)24點問題的求解,需要的可以參考一下
    2021-12-12
  • C語言的字符函數(shù)和字符串函數(shù)詳解

    C語言的字符函數(shù)和字符串函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語言的字符函數(shù)和字符串函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C/C++中文件的隨機讀寫詳解及其作用介紹

    C/C++中文件的隨機讀寫詳解及其作用介紹

    這篇文章主要介紹了C/C++中文件的隨機讀寫詳解及其作用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 詳解C++中string的用法和例子

    詳解C++中string的用法和例子

    string是C++標(biāo)準(zhǔn)庫的一個重要的部分,主要用于字符串處理。這篇文章主要介紹了C++ string的用法和例子,需要的朋友可以參考下
    2018-05-05
  • C++多線程std::call_once的使用

    C++多線程std::call_once的使用

    本文主要介紹了C++多線程std::call_once的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++語言const 關(guān)鍵字使用方法圖文詳解

    C++語言const 關(guān)鍵字使用方法圖文詳解

    在類中,如果你不希望某些數(shù)據(jù)被修改,可以使用const關(guān)鍵字加以限定。const 可以用來修飾成員變量、成員函數(shù)以及對象
    2020-01-01
  • 深入淺析C++ traits技術(shù)

    深入淺析C++ traits技術(shù)

    traits就是提取“被傳進(jìn)的對象”對應(yīng)的返回類型,讓同一個接口實現(xiàn)對應(yīng)的功能。因為STL的算法和容器是分離的,兩者通過迭代器鏈接,本文通過實例代碼給大家介紹C++ traits技術(shù),感興趣的朋友一起看看吧
    2021-05-05
  • C語言利用模板實現(xiàn)簡單的棧類

    C語言利用模板實現(xiàn)簡單的棧類

    這篇文章主要為大家詳細(xì)介紹了C語言利用模板實現(xiàn)簡單的棧類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語言超詳細(xì)分析多進(jìn)程的概念與使用

    C語言超詳細(xì)分析多進(jìn)程的概念與使用

    在一個項目中并發(fā)執(zhí)行任務(wù)時多數(shù)情況下都會選擇多線程,但有時候也會選擇多進(jìn)程,例如可以同時運行n個記事本編輯不同文本,由一個命令跳轉(zhuǎn)到另外一個命令,或者使用不同進(jìn)程進(jìn)行協(xié)作
    2022-08-08

最新評論