類和對象-友元-全局函數做友元

全局函數做友元

#include<iostream>
using namespace std;class  Building 
{//goodGay全局函數是Building好朋友,可以訪問Building的私有成員 friend void goodGay(Building *building);
public:Building(){m_SittingRoom = "客廳";m_BedRoom = "臥室";}
public:string m_SittingRoom;//客廳
private:string m_BedRoom;//臥室 
};//全局函數
void goodGay(Building *building)
{cout<<"好基友全局函數 正在訪問:"<<building->m_SittingRoom<<endl;cout<<"好基友全局函數 正在訪問:"<<building->m_BedRoom<<endl;
} 
void test01()
{Building building;goodGay(&building);
} 
int main()
{test01();return 0;
}

在全局函數 void goodGay(Building *building) 中為什么要傳入 Building *building
指針呢?

友元函數的概念

在C++中,友元函數是一種特殊的函數,它不是類的成員函數,但被允許訪問類的私有成員和保護成員。友元函數可以通過兩種方式實現:

  1. 友元函數聲明為類的友元:在類的定義中聲明友元函數,這樣友元函數就可以直接訪問類的私有成員和保護成員。
  2. 傳遞類的對象或指針給友元函數:即使友元函數不是類的成員函數,通過傳遞類的對象或指針給友元函數,也可以實現訪問私有成員和保護成員的目的。

在代碼中的體現

代碼中展示了第二種方式:全局函數 goodGay 被聲明為類 Building 的友元函數,并通過傳遞 Building *building 指針來訪問 Building 類的私有成員 m_SittingRoomm_BedRoom

為什么使用指針作為參數?

在這里,使用指針作為參數有以下幾個原因:

  1. 直接訪問類的私有成員:指針可以直接操作對象的成員,包括私有成員,因為指針的訪問權限通常比對象的成員函數更靈活。

  2. 避免對象的復制:如果使用對象作為參數,會涉及到對象的復制構造函數,特別是當對象較大或者復制開銷較大時,效率可能不高。使用指針避免了這種復制。

  3. C++語言的傳統做法:在傳遞大型對象時,通常會使用指針或引用,而不是直接復制對象。

示例中的具體情況

test01 函數中,創建了一個 Building 對象 building,并將其地址作為參數傳遞給 goodGay 函數。在 goodGay 函數內部,通過指針訪問了 building 對象的私有成員 m_SittingRoomm_BedRoom

void goodGay(Building *building)
{cout << "好基友全局函數 正在訪問:" << building->m_SittingRoom << endl;cout << "好基友全局函數 正在訪問:" << building->m_BedRoom << endl;
} void test01()
{Building building;goodGay(&building); // 將building對象的地址傳遞給goodGay函數
} 

因此,使用指針作為參數是為了在全局函數中訪問類的私有成員,并且遵循了C++中友元函數的設計原則,允許在不將函數定義為類的成員函數的情況下訪問私有成員。

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

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

相關文章

MyBatis學習筆記-數據脫敏

如果項目需要對一些特殊、敏感的數據進行脫敏處理。根據實際的需求可以考慮在讀寫的過程中分別做脫敏操作。 一、寫過程參數脫敏 主要是使用mybatis框架提供的Interceptor實現。需要考慮不同類型的參數解析處理方式不同。 @Slf4j @AllArgsConstructor @Intercepts({@Signatu…

【vuejs】vue-router 之 addRoute 動態路由的應用總結

1. Vue Router 概述 Vue Router 是 Vue.js 官方的路由管理器&#xff0c;用于構建單頁面應用。它與 Vue.js 深度集成&#xff0c;讓開發者能夠輕松地構建具有復雜用戶界面的單頁面應用。Vue Router 允許你定義不同的路由&#xff0c;并通過 router-view 組件在應用中顯示匹配的…

【CSS】如何實現分欄布局

在CSS分欄布局中&#xff0c;設置寬度和樣式是一個基本且重要的步驟。這可以通過直接應用樣式到列元素&#xff08;通常是div元素&#xff09;上來實現。以下是一些常用的方法來設置分欄布局的寬度和樣式&#xff1a; 1. 使用百分比寬度 使用百分比寬度可以使列的大小相對于其…

MyBatis學習筆記-參數轉義處理

查詢參數中如果有傳入%的情況,數據會被全量返回。類似的可能還會有一些特殊符號的情況存在。這個時候可能需要在查詢數據的時候進行參數轉義處理。一般情況可能會考慮選擇下面的兩種方式處理。 一、基于Filter處理 主要通過實現Filter接口,自定義HttpServletRequestWrapper…

Stable Diffusion秋葉AnimateDiff與TemporalKit插件沖突解決

文章目錄 Stable Diffusion秋葉AnimateDiff與TemporalKit插件沖突解決描述錯誤描述&#xff1a;找不到模塊imageio.v3解決&#xff1a;參考地址 其他文章推薦&#xff1a;專欄 &#xff1a; 人工智能基礎知識點專欄&#xff1a;大語言模型LLM Stable Diffusion秋葉AnimateDiff與…

Java 漢諾塔問題 詳細分析

漢諾塔 漢諾塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又稱河內塔&#xff0c;是一個源于印度古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子&#xff0c;在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小…

vulnhub靶場ai-web 2.0

1 信息收集 1.1 主機發現 arp-scan -l 主機地址為192.168.1.4 1.2 服務端口掃描 nmap -sS -sV -A -T5 -p- 192.168.1.4 開放22&#xff0c;80端口 2 訪問服務 2.1 80端口訪問 http://192.168.1.4:80/ 先嘗試admin等其他常見用戶名登錄無果 然后點擊signup發現這是一個注…

prescan軟件中導入路徑文件txt/lpx

由于博主收到的是lpx格式的路徑文件&#xff0c;因此&#xff0c;第一步 1.記事本打開 ctrla 全選 ctrlc 復制 2.新建一個excel 鼠標定位到第一行第一列的格子 ctrlv 復制 3.數據欄“分列”功能 4. (0.1遞增的數列&#xff0c;緯度&#xff0c;經度&#xff0c;高程) 導入…

python——面向對象小練習士兵突擊與信息管理系統

士兵突擊 需求 1. 士兵 許三多 有一把 AK47 2. 士兵 可以 開火 3. 槍 能夠 發射 子彈 4. 槍 裝填 裝填子彈 —— 增加子彈數量 # 士兵突擊 # 需求 # 1. 士兵 許三多 有一把 AK47 # 2. 士兵 可以 開火 # 3. 槍 能夠 發射 子彈 # 4. 槍 裝填 裝填子彈 —— 增加子彈數量 cl…

JDBC操作流程

目錄 簡介 具體操作 1. 引入驅動包 1&#xff09;下載驅動包 2&#xff09;引入驅動包到項目中 2. 編寫代碼 1&#xff09;創建數據源 2&#xff09;建立連接 3&#xff09;構造 SQL 語句 4&#xff09;執行 SQL 語句 5&#xff09;釋放資源 總結 簡介 JDBC 就是使…

某網頁gpt的JS逆向

原網頁網址 (base64) 在線解碼 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果圖 調用代碼&#xff08;復制即用&#xff09; 把倒數第三行換成下面的base64解碼 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

C語言+ MSSQL技術開發的 PACS系統源碼:CT后處理技術之仿真內鏡CTVE

C語言 MSSQL技術開發的 PACS系統源碼&#xff1a;CT后處理技術之仿真內鏡CTVE 仿真內窺鏡VE VE是利用醫學影像作為原始數據&#xff0c;融合圖像處理、計算機圖形學、科學計算可視化、虛擬現實技術&#xff0c;模擬傳統光學內鏡的一種技術。 又叫做腔內重建技術&#xff0c;是…

試用筆記之-匯通來電顯示軟件

首先匯通來電顯示軟件下載 http://www.htsoft.com.cn/download/httelephone.rar

平衡樹專題Splay

寫在前面&#xff1a; 部分來自孫寶&#xff08;Steven24&#xff09;的博客&#xff0c;表示感謝。 認識 什么是Splay 就是BST的一種&#xff0c;整體效率是很高的&#xff0c;均攤的次數是O(logn)級別的。 基本操作就是把節點旋轉到BST的root&#xff0c;從而改善BST的平…

為適配kubelet:v0.4 安裝指定版本的docker

系統版本信息 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 0.4 版本的kubelet 報錯信息記錄 E0603 19:00:38.273720 44142 kubelet.go:734] Error syncing pod: API error (400): {"message": "starting container with non-empty reque…

免交互簡單操作

免交互 交互&#xff1a;我們發出指令控制程序的運行&#xff0c;程序在接收到指令后按照指令的效果作出對應的反應 免交互&#xff1a;間接的&#xff0c;通過第三方的方式把指令傳給程序&#xff0c;不用直接下達指令 Here Document免交互 這是命令行格式&#xff0c;也可…

不用找了!這個軟件自帶各行業話術,客服效率飛躍

有一款客服工具軟件&#xff0c;不但能吸附聊天窗口&#xff0c;實現圖文視頻話術的一鍵發送&#xff0c;還內置了多行業的優質客服話術模板&#xff0c;允許用戶直接下載使用&#xff0c;快速構建起適合自身企業的專業客服知識庫。 前言 在今天的快節奏商業環境中&#xff0c…

Linux shell腳本編程

一、sehll簡介&#xff1a; 用戶通過shell向計算機發送指令的 計算機通過shell給用戶返回指令的執行結果 1.1、通過shell編程可以達到的效果 提高工作的效率 可以實現自動化 1.2、sehll腳本編寫的流程 1、用vi/vim創建一個.sh的文件 2、在文件中進行開發 3、個文件賦予可執行權…

CesiumJS【Basic】- #047 繪制閃爍線(Entity方式)- 需要自定義著色器

文章目錄 繪制閃爍線(Entity方式)- 需要自定義著色器1 目標2 代碼2.1 main.ts繪制閃爍線(Entity方式)- 需要自定義著色器 1 目標 使用Entity方式繪制閃爍線 2 代碼 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium<

【如何使用RSA簽名驗簽】python語言

文章目錄 簽名方法異步同步通知數據驗簽生活號響應數據驗簽同步響應數據驗簽 &#x1f308;你好呀&#xff01;我是 山頂風景獨好 &#x1f388;歡迎踏入我的博客世界&#xff0c;能與您在此邂逅&#xff0c;真是緣分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的…