cpp-友元

理解 C++ 中的友元(Friend)

在 C++ 語言中,封裝(Encapsulation) 是面向對象編程的重要特性之一。它允許類將數據隱藏在私有(private)或受保護(protected)成員中,防止外部直接訪問。然而,在某些情況下,我們希望某些函數或類能夠訪問這些私有成員,而不破壞封裝性。這時,我們就需要友元(Friend)


1. 什么是友元?

友元(friend) 是 C++ 提供的一種機制,它允許一個函數或另一個類訪問某個類的私有和受保護成員。友元有三種類型:

  1. 友元函數(Friend Function)

  2. 友元類(Friend Class)

  3. 友元成員函數(Friend Member Function)


2. 友元函數

友元函數是一個非成員函數,但它可以訪問類的私有和受保護成員。要聲明友元函數,需要在類內部使用 friend 關鍵字。

示例:友元函數

#include <iostream>
using namespace std;class Box {
private:double width;public:Box(double w) : width(w) {}// 聲明友元函數friend void printWidth(const Box &b);
};// 定義友元函數
void printWidth(const Box &b) {cout << "Width: " << b.width << endl;
}int main() {Box b(10.5);printWidth(b);return 0;
}

在上面的示例中,printWidth 不是 Box 類的成員函數,但由于它被聲明為 friend,它可以訪問 Box 的私有成員 width


3. 友元類

友元類允許一個類訪問另一個類的私有和受保護成員。

示例:友元類

#include <iostream>
using namespace std;class Engine {
private:int horsepower;public:Engine(int hp) : horsepower(hp) {}// 聲明 Car 為友元類friend class Car;
};class Car {
public:void showEnginePower(const Engine &e) {cout << "Engine horsepower: " << e.horsepower << endl;}
};int main() {Engine e(150);Car c;c.showEnginePower(e);return 0;
}

在這個例子中,CarEngine 的友元類,因此它可以訪問 Engine 類的私有成員 horsepower


4. 友元成員函數

我們還可以只將另一個類的某個成員函數設為友元,而不是整個類。

示例:友元成員函數

#include <iostream>
using namespace std;class Engine;class Car {
public:void showEnginePower(const Engine &e);
};class Engine {
private:int horsepower;public:Engine(int hp) : horsepower(hp) {}// 聲明 Car::showEnginePower 為友元friend void Car::showEnginePower(const Engine &e);
};void Car::showEnginePower(const Engine &e) {cout << "Engine horsepower: " << e.horsepower << endl;
}int main() {Engine e(200);Car c;c.showEnginePower(e);return 0;
}

這里 Car::showEnginePowerEngine 的友元成員函數,因此它可以訪問 Engine 的私有成員。


5. 友元的應用場景

友元在以下情況中非常有用:

  1. 運算符重載(如 operator<<operator>> 需要訪問類的私有成員)。

  2. 類之間的緊密協作(如 Car 需要訪問 Engine 的私有數據)。

  3. 全局函數需要訪問私有數據(如調試函數、日志記錄等)。


6. 友元的優缺點

優點:

  • 允許外部函數/類訪問私有數據,增強類之間的協作能力。

  • 使操作符重載更加直觀。

缺點:

  • 破壞了封裝性,降低了數據的安全性。

  • 可能導致代碼耦合度增加。


7. 總結

  1. 友元函數 可以訪問類的私有/受保護成員,但不是類的成員。

  2. 友元類 允許另一個類訪問本類的私有成員。

  3. 友元成員函數 允許一個類的特定成員函數訪問本類的私有成員。

  4. 友元應該謹慎使用,避免破壞封裝性。

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

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

相關文章

JavaWeb基礎-HTTP協議、請求協議、響應協議

一. HTTP協議 1. HTTP協議&#xff1a;Hyper Text Transfer Protocol&#xff0c;超文本傳輸協議&#xff0c;規定了瀏覽器和服務器之間數據傳輸的規則 2. HTTP協議特點&#xff1a; ① 基于TCP協議&#xff1a;面向鏈接&#xff0c;安全 ② 基于請求-響應模型的&#xff1a;一…

search_fields與filterset_fields的使用

在Django中&#xff0c;search_fields 和 filterset_fields 可以在視圖類中使用&#xff0c;尤其是在 Django REST Framework (DRF) 中。它們分別用于實現搜索和過濾功能。以下是它們在視圖類中的具體使用方法。 1. search_fields 在視圖類中的使用 search_fields 是 DRF 中 S…

數據建模流程: 概念模型>>邏輯模型>>物理模型

數據建模流程 概念模型 概念模型是一種高層次的數據模型&#xff0c;用于描述系統中的關鍵業務概念及其之間的關系。它主要關注業務需求和數據需求&#xff0c;而不涉及具體的技術實現細節。概念模型通常用于在項目初期幫助業務人員和技術人員達成共識&#xff0c;確保對業務需…

在 Ubuntu 中用 Docker 安裝 RAGFlow

一、安裝 1.前提條件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安裝docker&#xff1a;在Ubuntu中安裝Docker并配置國內鏡像 2.設置 vm.max_map_count #設置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

Java隨機生成n位驗證碼

Java學習筆記 今天寫一個隨機生成n位的驗證碼&#xff0c;包含字母大小寫和數字&#xff0c;直接見代碼。 package com.itheima.hello;// 生成一個隨機位數的驗證碼 public class ScannerDemo1 {public static void main(String[] args){System.out.println(getCode(4));Syst…

go復習目錄

全部都是博主的學習筆記&#xff0c;放著鏈接用的&#xff0c;自己收藏&#xff0c;包含基礎內容、go三方包、vue、數據結構、web框架、設計模式、docker、go連接kafka、redis、grpc、中間件 文章目錄 基礎內容go三方包vue數據結構web框架設計模式dockergo連接kafkaredisgrpc中…

23種設計模式-創建型模式-抽象工廠

文章目錄 簡介場景問題1. 風格一致性失控2. 對象創建硬編碼3. 產品族管理失效 解決總結 簡介 抽象工廠是一種創建型設計模式&#xff0c;可以生成相關對象系列&#xff0c;而無需指定它們的具體類。 場景 假設你正在寫一個家具店模擬器。 你的代碼這些類組成&#xff1a; 相…

案例:網絡命名空間模擬隔離主機場景

場景描述 假設我們需要在同一臺物理機上模擬兩臺獨立的主機&#xff08;Host A 和 Host B&#xff09;&#xff0c;它們分別位于不同的網絡命名空間中&#xff0c;并通過虛擬以太網對&#xff08;veth pair&#xff09;進行通信。目標是展示網絡命名空間的隔離性和跨命名空間的…

新聞發布時間抽取(二)

1. 再論抽取方法 在前一期實驗中&#xff0c;對gne組件進行分析和完善&#xff0c;對三種時間抽取的方法進行了實驗對比。 在對抽取結果進行個例分析的過程中&#xff0c;我發現此前實驗存在幾個問題&#xff1a; 抽取的1000篇新聞存在一定的重復&#xff0c;經過ID去重大約減…

算法基礎——棧

一、棧的概念 棧是?種只允許在?端進?數據插?和刪除操作的線性表。 進?數據插?或刪除的?端稱為棧頂&#xff0c;另?端稱為棧底。不含元素的棧稱為空棧。進棧就是往棧中放?元素&#xff0c;出棧就是將元素彈出棧頂。 二、棧的模擬實現 1. 創建 本質還是線性表&#…

Android11至15系統定制篇

Android 11至15系統定制核心要點解析 一、Android 11關鍵定制特性 ?分區存儲強制化? 公共目錄&#xff08;如Downloads、Pictures&#xff09;與應用專屬目錄分離&#xff0c;應用更新后無法通過requestLegacyExternalStorage繞過限制?1。需申請MANAGE_EXTERNAL_STORAGE權限…

macOS 使用 enca 識別 文件編碼類型(比 file 命令準確)

文章目錄 macOS 上安裝 enca基本使用起因 - iconv關于 enca安裝 Encaenca & enconv 其它用法 macOS 上安裝 enca brew install enca基本使用 enca filepath.txt示例 $ enca 動態規劃算法.txt [0] Simplified Chinese National Standard; GB2312CRLF line terminat…

線段樹與掃描線 —— 詳解算法思想及其C++實現

目錄 一、線段樹&#xff08;Segment Tree&#xff09; 基本概念 結構 操作 示例代碼 二、掃描線&#xff08;Sweep Line&#xff09; 基本概念 應用場景 示例代碼&#xff08;矩形面積并集&#xff09; 三、總結 一、線段樹&#xff08;Segment Tree&#xff09; 基本…

匯編代碼中嵌入回調函數的優化說明

一、概述 在 PowerPC 的匯編代碼中&#xff0c;我們需要實現調用 C 函數&#xff08;例如回調函數&#xff09;&#xff0c;并傳遞參數。本文將詳細介紹如何通過一系列步驟完成這一目標&#xff0c;包括代碼示例和詳細的注釋。 二、調用 C 函數的基本步驟及代碼 1. 保存工作寄…

Uni-App 雙欄聯動滾動組件開發詳解 (電梯導航)

本文基于提供的代碼實現一個左右聯動的滾動組件&#xff0c;以下是詳細的代碼解析與實現原理說明&#xff1a; <!--雙欄聯動滾動組件 - 技術解析功能特性&#xff1a;1. 左側導航欄與右側內容區雙向聯動2. 自適應容器高度3. 平滑滾動定位4. 動態內容位置計算 --> <te…

軟考復習-傳輸介質與編碼

傳輸介質 雙絞線 傳輸距離100一200m&#xff0c;即網線&#xff0c;有多種分類 UTP非屏蔽雙絞線 STP屏蔽雙絞線 線序標準有兩種為&#xff1a; T568A標準&#xff1a;綠白、綠、橙白、藍、藍白、橙、棕白、棕 T568B標準&#xff1a;橙白、橙、綠白、藍、藍白、綠、棕白、…

論文閱讀筆記:Denoising Diffusion Probabilistic Models (3)

論文閱讀筆記&#xff1a;Denoising Diffusion Probabilistic Models (1) 論文閱讀筆記&#xff1a;Denoising Diffusion Probabilistic Models (2) 論文閱讀筆記&#xff1a;Denoising Diffusion Probabilistic Models (3) 4、損失函數逐項分析 可以看出 L L L總共分為了3項…

PyTorch 面試題及參考答案(精選100道)

目錄 PyTorch 的動態計算圖與 TensorFlow 的靜態計算圖有何區別?動態圖的優勢是什么? 解釋張量(Tensor)與 NumPy 數組的異同,為何 PyTorch 選擇張量作為核心數據結構? 什么是 torch.autograd 模塊?它在反向傳播中的作用是什么? 如何理解 PyTorch 中的 nn.Module 類?…

#C8# UVM中的factory機制 #S8.1.4# 約束的重載

今天,復習一下《UVM實戰》一書中的 關于約束的重載 章節學習。 一 問題引導 文件:src/ch8/section8.1/8.1.2/rand_mode/my_transaction.sv4 class my_transaction extends uvm_sequence_item; …17 constraint crc_err_cons{18 crc_err == 1b0;19 }20 const…

空調遙控器低功耗單片機方案

RAMSUN空調遙控器采用先進的32位低功耗單片機作為核心控制器&#xff0c;通過優化軟件算法和硬件設計&#xff0c;實現了空調遙控器的低功耗運行。單片機集成了多種功能模塊&#xff0c;包括紅外發射、按鍵掃描、電源管理等&#xff0c;有效降低了整體功耗。同時&#xff0c;該…