【帶頭學C++】----- 九、類和對象 ---- 9.12 C++之友元函數(9.12.1---12.4)

??????????????????????創做不易,麻煩點個關注????????????????????????

??????????????????文末有驚喜!獻舞一支!????????????????????

目錄

9.12 C++之友元函數

9.12.1 友元函數的聲明friend

9.12.2 普通全局函數作為類的友元函數

9.12.3 類的某個成員函數作為另外一個類的友元函數

9.12.4 整個類作為另外一個類的友元

點贊👍? + 收藏👐 + 關注👌


9.12 C++之友元函數

問題:什么是友元函數?

????????在 C++ 中,友元函數是指在一個類的外部定義的、被該類聲明為友元的非成員函數。友元函數可以訪問該類的所有成員包括私有成員),并且可以在不通過類對象進行訪問的情況下改變成員的值

? ? ? ? 類的擁有不同權限訪問函數的一個主要特點,即類的私有成員無法在類的外部(作用域之外)訪問。但是,我們上一小節文章末尾留下了一個疑惑,在有時候需要在類的外部訪問類的私有成員怎么辦?
????????解決方法是使用友元函數,友元函數是一種特權函數,C++允許這個特權函數訪問私有成員。這一點從現實生活中也可以很好的理解。比如你的錢是你個人私有的,你家里人拿你的錢你是可以允許的,但是一個陌生人來拿你的錢,你就不能直接給他了。這時候你家人出來一個說這是他的律師來,是他的朋友,拿了一個東西證明了這個關系(friend == 合法合同、或者律師證,或者你的電話,或者你本人,用來證明你們朋友關系的紐帶),這樣就可以把你個人的錢給他了。我們可以把一個全局函數、某個類中的成員函數、甚至整個類聲明為友元。

? ? ?(👮👮👮這里提醒大家,不要輕易給陌生人轉賬、發紅包、匯款等,任何!所有!一切!讓你先轉賬才可以得到什么的理由!!!都是詐騙!!!并且不是通過購物平臺或者官方的平臺的,私人的那種,而且交易方式沒有實名等!都是騙子!警惕詐騙,轉賬之前一定要確認對方是否是你認識的人,或者是你的家人等等。警防網絡詐騙,讓騙子無處可騙。防詐騙從每個人做起👮👮👮)

? ? ? ? 特別的:友元函數會破壞類的封裝性😭,因為私有數據可以被外部訪問到

9.12.1 友元函數的聲明friend

????????友元函數使用friend關鍵字聲明一個函數為友元函數。

? ? ? ? friend關鍵字只使用于聲明處,一個函數或者是類對象作為另外一個類的友元,例如A類作為B類的友元,那么A類可以直接訪問B類中的私有數據。

? ? ? ? 友元比較著重運用在運算符重載上。

9.12.2 普通全局函數作為類的友元函數

這里我們使用了一個案例舉例:是在千鋒教育C++嵌入式基礎班講解(后續案例用qf縮寫代替)的一個案例:例如你的家,有客廳,有你的臥室,那么你的客廳是Public的,所有來的客人都可以進去,但是你的臥室是私有的,也就是說只有你能進去,但是呢,你也可以允許你的好閨蜜、好基友進去參觀你的臥室(基于正常情況,防止杠精)。

1.當不是友元的時候,訪問私有成員會報錯的

當使用相同名字的時候,聲明為友元函數的時候,公共函數visitingfun()就沒有報錯。?

完整案例+結果

代碼:

#include <iostream>
#include <string>
using namespace std;class Room
{friend void visitingfun(Room &room);
private:string bedRoom;//臥室public:
public:string setingRoom;//客廳pubTic:
public:Room(string bedRoom, string setingRoom){this->bedRoom = bedRoom;this->setingRoom = setingRoom;}
};
//普通全局函數
void visitingfun(Room &room){cout<<"訪問了"<<room.setingRoom<<endl;cout<<"訪問了"<<room.bedRoom<<endl;
}
void test01(){Room room("私人豪華大床房臥室","公共188大平層客廳");visitingfun(room);
}
int main()
{test01();return 0;
}

9.12.3 類的某個成員函數作為另外一個類的友元函數

這個案例中,goodfriens類中的vistinng_02成員函數作為Room1類的友元函數。此時就是不同類的成員,進行一個私有成員變量的訪問。

拓展:

?上面的案例中,成員函數聲明和定義順序比較關鍵,總所周知,程序是向下編譯的,順序執行。

那看下面這個圖片中:成員函數放到類對象里,此時報錯原因,即使你提前聲明了Room1,但是由于初始化階段,還沒有生成Room1的成員,此時編譯器是不知道Room1里面有什么成員的。所以此時報錯了。

另外,goodfriends的聲明也應該在Room1聲明之前(這里僅僅針對9.12.3主題來說,因為你要的是成員函數)?,編譯器提前聲明只是知道了一個名字,編譯順序始終是從上往下執行的。

所以,你要把類中要成為友元函數的成員函數,定義實現放在外面,放在所有類的聲明的后面就行了。

9.12.4 整個類作為另外一個類的友元

????????就是這個類的所有成員函數都可以訪問另一個類的私有數據。

并且,聲明的順序可成員函數的基本一致。

?代碼:

class Room1;//向前聲明方式,這樣只能說明類的名稱
class goodfrieds
{
public:void visiting_01(Room1 &room);void visiting_02(Room1 &room);};
class Room1{//friend void goodfrieds::visiting_02(Room1 &room);friend class goodfrieds;
private:string bedRoom;//臥室public:
public:string setingRoom;//客廳pubTic:
public:Room1(string bedRoom, string setingRoom){this->bedRoom = bedRoom;this->setingRoom = setingRoom;}
};
void goodfrieds::visiting_01(Room1 &room){cout<<"訪問了01"<<room.setingRoom<<endl;cout<<"訪問了01"<<room.bedRoom<<endl;
}
void goodfrieds::visiting_02(Room1 &room){cout<<"訪問了02"<<room.bedRoom<<endl;cout<<"訪問了02"<<room.setingRoom<<endl;
}
void test03(){Room1 room("私人豪華大床房臥室","公共188大平層客廳");goodfrieds ob;ob.visiting_01(room);ob.visiting_02(room);
}
int main()
{test03();return 0;
}

點贊👍? + 收藏👐 + 關注👌

??您的支持??是我最大的動力??相互學習??共同進步??一起搞錢??動動發財的小手??

? ????????????????????十星好評,Erike的專用模板????????????????????

謝? ? ?謝? ? ?老? ? ?板!老? ? ?板? ? ?大? ? ?氣!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214097.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TypeError: Cannot set properties of undefined (setting ‘xx‘)

在寫代碼中經常會遇到TypeError: Cannot set properties of undefined (setting ‘xx‘)&#xff0c;這個問題。 一般出現的場景&#xff1a;在調用接口訪問后端數據時&#xff0c;前端渲染顯示空白&#xff0c;并報此錯。例如&#xff0c;我在調用高德地圖&#xff0c;輸入經…

五:爬蟲-數據解析之xpath解析

三&#xff1a;數據解析之xpath解析 1.xpath介紹&#xff1a; ? xpath是XML路徑語言&#xff0c;它可以用來確定xml文檔中的元素位置&#xff0c;通過元素路徑來完成對元素的查找&#xff0c;HTML就是XML的一種實現方式&#xff0c;所以xpath是一種非常強大的定位方式? XPa…

vue2 element-ui select下拉框 選擇傳遞多個參數

<el-select v-model"select" slot"prepend" placeholder"請選擇" change"searchPostFn($event,123)"> <el-option :label"item.ziDianShuJu" :value"{value:item.id, label:item.ziDianShuJu}" v-for&qu…

Ubuntu系統使用快速入門實踐(七)——軟件安裝與使用(5)

Ubuntu系統使用快速入門實踐系列文章 下面是Ubuntu系統使用系列文章的總鏈接&#xff0c;本人發表這個系列的文章鏈接均收錄于此 Ubuntu系統使用快速入門實踐系列文章總鏈接 下面是專欄地址&#xff1a; Ubuntu系統使用快速入門實踐系列文章專欄 文章目錄 Ubuntu系統使用快速…

crypto-js加密、解密與node Crypto加解密模塊的應用

前端用crypto-js實現加解密&#xff0c;node端用Crypto模塊&#xff0c;兩者想要相同結果的話&#xff0c;就要保持加密密鑰和加密算法一致。 crypto-js加密、解密 參考&#xff1a; 『crypto-js 加密和解密』 前端使用CryptoJS加密解密 // DES算法 import CryptoJS from cryp…

【unity】【WebRTC】從0開始創建一個Unity遠程媒體流app-構建可同步場景

【背景】 最近在研究遠程畫面&#xff0c;所以就實踐了一下。技術采用我認為比較合適的WebRTC。 這篇文章的基礎是我的另一篇博文&#xff0c;如果希望順利完成本篇操作&#xff0c;請先關注我后查詢我的如下博文&#xff1a; 【WebRTC】【Unity】Unity Web RTC1-Unity中簡單實…

Docker架構及常用的命令

一、初識Docker 1、 docker是一個快速交付應用、運行應用的技術&#xff0c;具備下列優勢&#xff1a; 可以將程序及其依賴、運行環境一起打包為一個鏡像&#xff0c;可以遷移到任意Linux操作系統運行時利用沙箱機制形成隔離容器&#xff0c;各個應用互不干擾啟動、移除都可以…

邊緣智能網關如何應對環境污染難題

隨著我國工業化、城鎮化的深入推進&#xff0c;包括大氣污染在內的環境污染防治壓力繼續加大。為應對環境污染防治難題&#xff0c;佰馬綜合邊緣計算、物聯網、智能感知等技術&#xff0c;基于邊緣智能網關打造環境污染實時監測、預警及智能干預方案&#xff0c;可應用于大氣保…

銀行數據分析入門篇:信用卡全生命周期分析,到底應該怎么做?

最近有朋友向我咨詢銀行信貸業務的數據分析&#xff0c;就看了很多案例&#xff0c;剛好看到一個信用卡全生命周期分析的案例&#xff0c;做得很詳細又通俗易懂&#xff0c;基本上可以直接復制套用&#xff0c;所以特地分享給大家。 本文主要分享作者整個分析作品的思路&#x…

Unity對象池

標題&#xff1a;Unity對象池技術詳解 一、引言 在Unity游戲開發中&#xff0c;我們經常需要創建大量的游戲對象&#xff0c;如子彈、敵人和道具等。然而&#xff0c;頻繁地創建和銷毀這些對象會消耗大量的系統資源&#xff0c;影響游戲的性能。為了解決這個問題&#xff0c;…

golang 使用 viper 加載配置文件 自動反序列化到結構

golang使用 viper 無需設置 mapstructure tag 根據配置文件后綴 自動返序列化到結構 解決結構有下劃線的字段解析不成功問題 viper 正常加載配置文件 golang viper 其中可以用來 查找、加載和反序列化JSON、TOML、YAML、HCL、INI、envfile和格式的配置文件 配置文件 test_to…

jdom利用純java技術對xml文檔進行解析、生成、序列化等各種操作

Jdom對xml文檔進行解析、生成、序列化等各種操作。 使用jdom之前&#xff0c;首先要導入jar包&#xff1a;jdom.jar 獲得根元素&#xff1a; //首先確定xml文件位置 String xmlPath "./src/ceshi/Test.xml"; //使用的解析器&#xff0c;這里表示默認的解…

KMP算法數組下標從0和數組下標從1開始

我在運用KMP時&#xff0c;總時會搞混如果數組下標為0時要如何用寫&#xff0c;下標為1時要如何寫。 當下標為0時kmp void kmp(int len) {//下標為0 時vector<int> f(n,-1);for(int i 1;i < len;i){ // 每次更新的是 下標i // 當第 i1不匹配是 跳到 f[i]的位置上&…

106.進程控制(結束、孤兒、僵尸進程)以及進程回收

目錄 結束進程 孤兒進程 僵尸進程 進程回收 wait() waitpid 進程控制是指在操作系統中對進程進行創建、終止、掛起、喚醒以及進程之間的同步、通信等操作的管理。 結束進程 exit() 和 _exit() 函數都用于終止一個進程&#xff0c;但它們之間有一些重要的區別&#xf…

新工科:數據科學與大數據技術實驗中心解決方案,賦能高校新工科數智人才培養

隨著數字經濟蓬勃發展&#xff0c;數字化產業和產業數字化成為就業增長新動能。據人瑞人才與德勤調研顯示&#xff0c;未來3年&#xff0c;數字產業化企業最需要運營人員和開發人員&#xff08;包括大數據開發工程師、數據建模開發工程師等&#xff09;&#xff0c;其次是數據分…

【RTOS學習】FreeRTOS中的鏈表 | 堆的管理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;專欄&#xff1a;《RTOS學習》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交給時間&#xff01; 目錄 &#x1f969;FreeRTOS中的鏈表&#x1f95e;初始化&#x1f95e;尾部插入&#x1f95e;按順…

OpenWRT搭建本地web站點并結合內網穿透實現公網遠程訪問

文章目錄 前言1. 檢查uhttpd安裝2. 部署web站點3. 安裝cpolar內網穿透4. 配置遠程訪問地址5. 配置固定遠程地址 前言 uhttpd 是 OpenWrt/LuCI 開發者從零開始編寫的 Web 服務器&#xff0c;目的是成為優秀穩定的、適合嵌入式設備的輕量級任務的 HTTP 服務器&#xff0c;并且和…

【Windows】MCSM面板搭建Mycraft服務器,實現公網遠程聯機

文章目錄 前言1.Mcsmanager安裝2.創建Minecraft服務器3.本地測試聯機4. 內網穿透4.1 安裝cpolar內網穿透4.2 創建隧道映射內網端口 5.遠程聯機測試6. 配置固定遠程聯機端口地址6.1 保留一個固定TCP地址6.2 配置固定TCP地址 7. 使用固定公網地址遠程聯機 前言 MCSManager是一個…

[香橙派]Orange pi zero 3命令行配網方法——建立ssh連接——Ubuntu配置WIFI自動連接

一、前言 前面我們給Orange Pi安裝了Ubuntu系統&#xff0c;并通過MobaXterm進行了串口連接&#xff0c;但其實并不方便&#xff0c;在日常開發中&#xff0c;我們希望能夠使用更方便的ssh連接來進行操作&#xff0c;因此配置網絡是必要的。 本章介紹的方法無需網線、HDMI線等&…

upload-labs

01 隨便上傳個文件 發現對于上傳類型有限制 查看頁面代碼發現是js的過濾直接關閉js 上傳成功 右鍵圖片在新建標簽頁打開文件 這里直接抓包改名字也行 02 抓包修改后綴名 03 發現后端做了檢測抓包修改失敗 大小寫繞過失敗&#xff0c;php特性php1等會被當成php執行 這里圖片的…