C++核心編程友元的應用

文章目錄

      • 1.友元
        • 1.什么是友元
        • 2.全局函數做友元
        • 2.類做友元
        • 3.成員函數做友元

1.友元

1.什么是友元

在C++中,友元(friend)是一種允許一個類或函數訪問另一個類的非公有(private 或 protected)成員的機制。這種機制打破了類的封裝性,因此在使用時需要謹慎。然而,在某些情況下,友元提供了一種方便的方式來實現特定的功能,如操作符重載、輸入輸出流操作等。

友元可以是另一個類、類的成員函數、或者全局函數。當一個類或函數被聲明為另一個類的友元時,它就可以訪問那個類的所有私有和保護成員。

2.全局函數做友元

全局函數(非類成員函數)也可以被聲明為類的友元。這樣做允許全局函數訪問類的私有(private)和保護(protected)成員。

#include <iostream>class MyClass {// 聲明全局函數 friendFunc 為友元friend void friendFunc(MyClass& obj);private:int secretValue;public:MyClass(int value) : secretValue(value) {}
};// 全局函數,它可以訪問 MyClass 的私有成員
void friendFunc(MyClass& obj) {std::cout << "Secret value: " << obj.secretValue << std::endl;
}int main() {MyClass myObj(42);friendFunc(myObj);  // 輸出: Secret value: 42return 0;
}

在這個例子中,friendFunc 是一個全局函數,它被聲明為 MyClass 的友元。因此,friendFunc 可以訪問 MyClass 的私有成員 secretValue。在 main 函數中,我們創建了一個 MyClass 對象 myObj,并將其傳遞給 friendFunc,后者成功輸出了 secretValue 的值。

2.類做友元

在C++中,一個類也可以被聲明為另一個類的友元。當一個類被聲明為另一個類的友元時,這個友元類可以訪問另一個類的私有(private)和保護(protected)成員。這種機制在某些情況下可能很有用,特別是當兩個類需要緊密協作,并且一個類需要直接訪問另一個類的內部數據時。

#include <iostream>class MyClass {// 聲明另一個類(例如 MyFriendClass)為友元friend class MyFriendClass;private:int secretValue;public:MyClass(int value) : secretValue(value) {}// 提供一個公共函數以顯示secretValue的值(僅用于比較)void displaySecretValue() const {std::cout << "Secret value: " << secretValue << std::endl;}
};// 友元類 MyFriendClass
class MyFriendClass {
public:// MyFriendClass 可以訪問 MyClass 的私有成員void printSecret(const MyClass& obj) {std::cout << "MyFriendClass sees: " << obj.secretValue << std::endl;}
};int main() {MyClass myObj(42);MyFriendClass friendObj;// 通過 MyClass 的公共函數顯示 secretValuemyObj.displaySecretValue(); // 輸出: Secret value: 42// 通過 MyFriendClass 訪問 MyClass 的私有成員friendObj.printSecret(myObj); // 輸出: MyFriendClass sees: 42return 0;
}

在這個例子中,MyFriendClass 被聲明為 MyClass 的友元。因此,MyFriendClass 中的成員函數 printSecret 可以訪問 MyClass 對象的 secretValue 成員,即使它是私有的。注意,友元關系不是雙向的;即 MyClass 不是 MyFriendClass 的友元,除非另外聲明。

使用類作為友元時要特別小心,因為它破壞了封裝性,并可能導致代碼難以維護和理解。在可能的情況下,最好使用公共接口和受保護的成員來實現類之間的協作。然而,在某些情況下,類作為友元可能是實現特定功能所必需的。

3.成員函數做友元

在C++中,成員函數本身并不直接作為另一個類的友元,因為成員函數是類的一部分,它總是能夠訪問其所在類的所有成員(包括私有和保護成員)。然而,你可以將一個類的成員函數聲明為另一個類的友元,但實際上是將這個成員函數所屬的整個類聲明為友元。

但如果你想讓另一個類的成員函數能夠訪問當前類的私有或保護成員,你應該做的是將該成員函數所在的整個類聲明為當前類的友元。

#include <iostream>class MyClass {// 聲明另一個類(例如 OtherClass)為友元friend class OtherClass;private:int secretValue;public:MyClass(int value) : secretValue(value) {}// 提供一個公共函數以顯示secretValue的值(僅用于比較)void displaySecretValue() const {std::cout << "Secret value: " << secretValue << std::endl;}
};class OtherClass {
public:// 這個成員函數可以訪問 MyClass 的私有成員void printSecret(const MyClass& obj) {std::cout << "OtherClass sees: " << obj.secretValue << std::endl;}
};int main() {MyClass myObj(42);OtherClass friendObj;// 通過 MyClass 的公共函數顯示 secretValuemyObj.displaySecretValue(); // 輸出: Secret value: 42// 通過 OtherClass 的成員函數訪問 MyClass 的私有成員friendObj.printSecret(myObj); // 輸出: OtherClass sees: 42return 0;
}

在這個例子中,OtherClass 被聲明為 MyClass 的友元,這意味著 OtherClass 的所有成員函數(不僅僅是 printSecret)都可以訪問 MyClass 的私有成員。然而,在實際編程中,通常最好只將真正需要訪問私有成員的成員函數所在的類聲明為友元,以保持封裝的完整性。

//
// Created by 86189 on 2024/6/6.
//
#include "iostream"
using namespace std;class myClassFriend;
class myClass{
public:myClass();void visit();myClassFriend *myClassfriend;
};
class myClassFriend{friend void  myClass::visit();;
public:myClassFriend();
public:string name;
private:string sex;
};myClassFriend::myClassFriend() {name = "張三";sex = "男";
}myClass::myClass() {myClassfriend = new myClassFriend;
}void myClass::visit() {cout << myClassfriend->name << endl;cout << myClassfriend->sex << endl;
}int main() {myClass myclass;myclass.visit();delete myclass.myClassfriend;return 0;
}

只通過成員函數訪問另一個類的私有成員。

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

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

相關文章

系統研發安全漏洞

軟件安全漏洞指的是軟件中存在的具體缺陷或疏忽&#xff0c;這些缺陷或疏忽能夠被攻擊者利用并執行一些惡意行為。這些行為包括但不限于泄露或修改敏感信息、干擾或銷毀系統、接管計算機系統或程序權限等。與大眾熟悉的軟件缺陷&#xff08;Bug&#xff09;相比&#xff0c;安全…

Mysql中表的常用約束

在MySQL表中常用的約束有以下幾種&#xff1a; 1. 主鍵約束&#xff08;Primary Key Constraint&#xff09;&#xff1a;用于標識表中的唯一記錄。一個表只能有一個主鍵&#xff0c;主鍵列不能有重復值&#xff0c;也不能為NULL。 2. 唯一約束&#xff08;Unique Constraint…

2024050402-重學 Java 設計模式《實戰責任鏈模式》

重學 Java 設計模式&#xff1a;實戰責任鏈模式「模擬618電商大促期間&#xff0c;項目上線流程多級負責人審批場景」 一、前言 場地和場景的重要性 射擊&#x1f3f9;需要去靶場學習、滑雪&#x1f3c2;需要去雪場體驗、開車&#x1f697;需要能上路實踐&#xff0c;而編程…

Scanpy(4)用與數據整合和批次處理

Scanpy包,用與數據整合和批次處理,包含批次效應的BBKNN算法和用于對比的ingest基礎算法比較,及其原理簡介。 1. 依賴: (1)數據集(全部需要掛VPN): PBMC:pbmc3k_processed()(需要下載);pbmc68k_reduced()(scanpy自帶)Pancreas(需要下載)(2)Python包:Scanp…

【Python】把xmind轉換為指定格式txt文本

人工智能訓練通常需要使用文本格式&#xff0c;xmind作為一種常規格式不好進行解析&#xff0c;那如何把xmind轉換為txt格式呢&#xff1f; 軟件信息 python python -v Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32…

Python 包安裝及常用命令【python 入門】

背景&#xff1a; 近期看到一個項目&#xff0c;做微信只能機器人&#xff0c;服務是使用python搭建的&#xff0c;于是拷貝下來自己打算跑一跑&#xff0c;部署一下&#xff0c;可是自己又沒有python的經驗&#xff0c;于是各種查資料學習&#xff0c;跟著敲一敲&#xff0c;順…

Go 1.19.4 切片與子切片-Day 05

1. 切片 1.1 介紹 切片在Go中是一個引用類型&#xff0c;它包含三個組成部分&#xff1a;指向底層數組的指針&#xff08;pointer&#xff09;、切片的長度&#xff08;length&#xff09;以及切片的容量&#xff08;capacity&#xff09;&#xff0c;這些信息共同構成了切片的…

單片機排水泵高壓方案

靈動微多顆算力高、高可靠性的通用系列和電機專用系列MCU&#xff0c;配合成熟的控制算法&#xff0c;覆蓋了包括洗衣機在內的各種大小家電市場。 RAMSUN提供的MM32 MCU種類較多&#xff0c;例如洗衣機內部的排水泵系統&#xff0c;排水泵控制首選電控高性價比產品MM32SPIN023…

JavaWeb_SpringBootWeb案例

環境搭建&#xff1a; 開發規范 接口風格-Restful&#xff1a; 統一響應結果-Result&#xff1a; 開發流程&#xff1a; 第一步應該根據需求定義表結構和定義接口文檔 注意&#xff1a; 本文代碼從上往下一直添加功能&#xff0c;后面的模塊下的代碼包括前面的模塊&#xff0c…

Xmind Pro 2024 專業版激活碼(附下載鏈接)

說到思維導圖&#xff0c;就不能不提 Xmind。這是一款優秀的思維導圖工具&#xff0c;擁有著豐富的導圖模板&#xff0c;漂亮的界面和配色&#xff0c;以及各種各樣的創意工具。 新架構速度更快 采用全新 Snowdancer 引擎&#xff0c;一種堪稱「黑科技」的先進圖形渲染技術。…

翹首以盼的抗鋸齒

Antialiasing 實際的圖形學中是怎么實現反走樣的呢&#xff1f; 我們不希望實際產出的圖形有鋸齒效果&#xff0c;那怎么辦呢&#xff1f; 從采樣的理論開始談起吧 Simpling theory 照片也是一種采樣&#xff0c;把景象打散成像素放到屏幕上的過程&#xff1a; 還可以在不…

14、企業數據資源相關會計處理暫行規定

為規范企業數據資源相關會計處理, 強化相關會計信息披露, 根據《中華人民共和國會計法》 和企業會計準則等相關規定, 現對企業數據資源的相關會計處理規定如下: 一、 關于適用范圍 本規定適用于企業按照企業會計準則相關規定確認為無形資產或存貨等資產類別的數據資源,以…

21 - 即時食物配送 II(高頻 SQL 50 題基礎版)

21 - 即時食物配送 II -- sum(if(order_datecustomer_pref_delivery_date,1,0))/count(*)sum(order_datecustomer_pref_delivery_date)/count(*) -- count(*),表示數據的行數&#xff0c;如果有分組&#xff0c;為分組后數據的行數select round(100*sum(if(order_datecustomer_…

【名詞解釋】Unity的Button組件及其使用示例

Unity的Button組件是Unity引擎中UI系統的一部分&#xff0c;它允許用戶創建可交互的按鈕&#xff0c;用戶可以點擊這些按鈕來觸發事件。Button組件通常用于游戲界面中&#xff0c;比如開始游戲、暫停游戲、選擇選項等。 Button組件的主要屬性包括&#xff1a; interactable: …

原來Stable Diffusion是這樣工作的

stable diffusion是一種潛在擴散模型&#xff0c;可以從文本生成人工智能圖像。為什么叫做潛在擴散模型呢&#xff1f;這是因為與在高維圖像空間中操作不同&#xff0c;它首先將圖像壓縮到潛在空間中&#xff0c;然后再進行操作。 在這篇文章中&#xff0c;我們將深入了解它到…

達摩院重大“遺產”!fluxonium量子比特初始化300納秒且保真度超過99%

通用量子計算機開發的主要挑戰之一是制備量子比特。十多年來&#xff0c;研究人員在構建量子計算機的過程中主要使用了transmon量子比特&#xff0c;這也是迄今為止商業上最成功的超導量子比特。 但與業界多數選擇transmon量子比特不同&#xff0c;&#xff08;前&#xff09;…

npm運行報錯:無法加載文件 C:\Program Files\nodejs\npm.ps1,因為在此系統上禁止運行腳本問題解決

問題其實已經顯而易見了 系統禁止運行腳本 以管理員身份運行 PowerShell&#xff1a; 右鍵點擊“開始”按鈕或按 Win X&#xff0c;然后選擇“Windows PowerShell(管理員)”。 查看當前執行策略&#xff1a; 在 PowerShell 中輸入以下命令來查看當前的執行策略&#xff1a; G…

Python文本處理利器:jieba庫全解析

文章目錄 Python文本處理利器&#xff1a;jieba庫全解析第一部分&#xff1a;背景和功能介紹第二部分&#xff1a;庫的概述第三部分&#xff1a;安裝方法第四部分&#xff1a;常用庫函數介紹1. 精確模式分詞2. 全模式分詞3. 搜索引擎模式分詞4. 添加自定義詞典5. 關鍵詞提取 第…

服務器遭遇UDP攻擊時的應對與解決方案

UDP攻擊作為分布式拒絕服務(DDoS)攻擊的一種常見形式&#xff0c;通過發送大量的UDP數據包淹沒目標服務器&#xff0c;導致網絡擁塞、服務中斷。本文旨在提供一套實用的策略與技術手段&#xff0c;幫助您識別、緩解乃至防御UDP攻擊&#xff0c;確保服務器穩定運行。我們將探討監…

最新PHP眾籌網站源碼 支持報名眾籌+商品眾籌+公益眾籌等多種眾籌模式 含完整代碼包和部署教程

在當今互聯網飛速發展的時代&#xff0c;眾籌模式逐漸成為了創新項目、商品銷售和公益活動融資的重要渠道。分享一款最新版的PHP眾籌網站源碼&#xff0c;支持報名眾籌、商品眾籌和公益眾籌等多種眾籌模式。該源碼包含了完整的代碼包和詳細的部署教程&#xff0c;讓新手也可以輕…