談談《More Effective C++》的條款30:代理類

在《More Effective C++》的條款30中,Scott Meyers深入探討了**代理類(Proxy Classes)**的設計與應用。代理類是一種通過重載運算符模擬原始對象行為的設計模式,其核心目標是在不直接暴露原始對象的情況下,提供額外功能、控制訪問或優化性能。以下是條款30的核心內容與實踐要點:

一、代理類的核心作用

代理類通過運算符重載(如operator[]operator())攔截對原始對象的訪問,并在背后執行特定邏輯。常見應用場景包括:

  1. 延遲計算(Lazy Evaluation)
    代理類可推遲實際對象的創建或計算,直到真正需要時才執行。例如,二維數組的代理類可在訪問元素時動態計算索引,避免預先分配全部內存。
  2. 邊界檢查與安全性增強
    在訪問數組元素時,代理類可檢查索引是否越界。例如,Array2Doperator()返回Array1D代理對象,后者的operator[]執行邊界驗證,確保操作安全。
  3. 只讀訪問控制
    通過代理類區分讀寫操作。例如,vector<bool>reference代理類在賦值時執行寫操作,而隱式轉換為bool時僅允許讀操作,防止意外修改。
  4. 隱藏實現細節
    代理類可封裝復雜實現,僅暴露必要接口。例如,通過interface代理類隱藏implementation類的私有數據,客戶端僅需與代理類交互。

二、實現代理類的關鍵技術

1. 運算符重載的靈活運用
  • operator[]operator()
    代理類常通過重載這兩個運算符實現元素訪問。例如:

    class Array1D {
    public:int& operator[](size_t index) { /* 邊界檢查 + 返回實際元素 */ }
    };class Array2D {
    public:Array1D operator()(size_t row) { /* 返回行代理對象 */ }
    };
    // 使用:Array2D arr; arr(3)[6] = 42; (兩次運算符調用)
    

    此處Array2D::operator()返回Array1D代理對象,后者的operator[]執行最終操作。

  • operator->與智能指針
    代理類可模擬指針行為,例如智能指針RCPtr(引用計數指針)通過operator->訪問原始對象,同時管理資源生命周期。

2. 模板與泛型設計

代理類常結合模板實現通用性。例如,延遲加載的Proxy<T>類可包裝任意類型:

template <typename T>
class Proxy {
private:T* data = nullptr;std::string filePath;
public:T& operator*() {if (!data) data = loadFromDisk(filePath); // 首次訪問時加載return *data;}
};

這種設計允許對大對象(如圖像、數據庫記錄)進行按需加載,避免內存浪費。

3. 引用計數與資源管理

代理類可與條款29的**引用計數指針(RCPtr)**結合,實現線程安全的資源共享。例如:

class StringValue;
typedef RCPtr<StringValue> String; // 代理類管理字符串資源
String s = "hello"; // 隱式轉換為代理對象

RCPtr確保字符串僅在最后一個代理對象銷毀時釋放內存。

三、代理類的典型應用示例

1. 二維數組的安全訪問

通過嵌套代理類實現多級訪問控制:

class Array1D {
private:std::vector<int>& data;size_t row;
public:int& operator[](size_t col) { return data[row * cols + col]; }
};class Array2D {
private:std::vector<int> data;size_t rows, cols;
public:Array1D operator()(size_t row) { return Array1D(data, row, cols); }
};

Array2Doperator()返回Array1D代理對象,后者的operator[]執行行列計算,避免越界訪問。

2. 只讀與讀寫分離

通過代理類區分讀寫操作:

class ConstStringProxy {
public:operator std::string() const { return realString; }
};class String {
public:ConstStringProxy operator[](size_t index) const { /* 返回只讀代理 */ }char& operator[](size_t index) { /* 返回可寫引用 */ }
};

String對象為const時,operator[]返回ConstStringProxy,禁止修改;非const時返回原始引用,允許修改。

四、代理類的優缺點與注意事項

優點
  • 封裝與抽象:隱藏復雜實現,降低客戶端代碼復雜度。
  • 安全性:通過邊界檢查、只讀控制等增強魯棒性。
  • 性能優化:延遲計算減少不必要的資源消耗。
缺點
  • 性能開銷:額外的運算符調用可能降低高頻訪問場景的效率。
  • 代碼復雜性:需處理運算符重載、對象生命周期等細節。
  • 隱式轉換限制:代理類可能需要限制隱式轉換,避免意外行為(如vector<bool>::reference無法取地址)。
實踐建議
  1. 謹慎使用隱式轉換
    代理類應明確控制轉換行為,避免與原始類型混淆。例如,vector<bool>reference代理類僅允許轉換為bool,但禁止轉換為bool&
  2. 結合pimpl idiom
    通過pimpl(指針到實現)模式將代理類的實現細節隱藏在.cpp文件中,減少編譯依賴。
  3. 權衡性能與功能
    在高頻訪問場景(如循環)中,需評估代理類的開銷是否可接受。必要時可提供非代理版本作為備選。

總結

代理類是C++中一種強大的抽象工具,通過運算符重載實現對原始對象的靈活控制。

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

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

相關文章

實用AI在線開發工具網址匯總(含免費限額,國內可訪)

AI在線開發工具 標題分類屬性在線開發工具1https://www.builder.io/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具2https://replit.com/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具3https…

react+vite來優化下每次使用hook函數都要引入的情況

前言&#xff1a;react項目中&#xff0c;每個頁面都得引入react/react-dom等元素&#xff0c;就像uniapp的項目中得onload,onshow等生命周期一樣&#xff0c;這里也可以用vite的插件&#xff1a;unplugin-auto-import 來解決我們每次都需要調用才能使用hook方法的問題。安裝&a…

【排序算法】⑤冒泡排序

系列文章目錄 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希爾排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接選擇排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

如何使用gpt進行模式微調(2)?

對 GPT&#xff08;Generative Pre-trained Transformer&#xff09;類大模型進行微調&#xff08;Fine-tuning&#xff09;&#xff0c;是將其適配到特定任務或領域的關鍵步驟。以下是 ??全流程指南??&#xff0c;涵蓋方法選擇、數據準備、訓練配置、評估部署等核心環節&a…

基于飛算JavaAI實現圖書管理系統框架部署

摘要 本文詳細介紹了如何利用飛算JavaAI技術實現圖書管理系統的框架部署。首先闡述了飛算JavaAI的基本概念、特點和優勢&#xff0c;接著對圖書管理系統的需求進行分析&#xff0c;然后按照軟件開發流程&#xff0c;從系統設計、代碼生成、框架搭建到部署測試&#xff0c;逐步展…

ODE-by-Matlab-01-人口增長模型

博客地址&#xff1a;Matlab微分方程01-模型 馬爾薩斯模型 馬爾薩斯模型是人口增長模型中最簡單的模型&#xff0c;它由英國牧師家馬爾薩斯在1798年提出。 他利用在教堂工作的機會&#xff0c;收集英國100多年的人口數據&#xff0c;發現人口的相對增長率是常數。 在這個基礎…

云原生環境 Prometheus 企業級監控實戰

目錄 一&#xff1a;基于 kubernetes 的 Prometheus 介紹 1&#xff1a;環境簡介 2&#xff1a;監控流程 3&#xff1a;Kubernetes 監控指標 二&#xff1a;Prometheus 的安裝 1&#xff1a;從 Github 克隆項目分支 2&#xff1a;安裝 Prometheus Operator --server-si…

Python爬蟲實戰:研究django-dynamic-scraper 框架,構建電商動態數據采集系統

1. 引言 1.1 研究背景 據 Statista 數據,2025 年全球互聯網數據總量將突破 175ZB,其中 80% 為非結構化數據(網頁、文本、圖像等)。高效提取這些數據對企業競爭情報、學術研究至關重要。網絡爬蟲作為數據獲取的核心工具,經歷了從靜態頁面抓取到動態內容解析的演進,但傳統…

掌握MATLAB三維可視化:從基礎到實戰技巧

目錄 1. 引言&#xff1a;三維可視化的重要性 2. 基礎三維圖形繪制 2.1 三維曲線圖&#xff08;plot3&#xff09; 2.2 三維散點圖&#xff08;scatter3&#xff09; 2.3 三維網格圖&#xff08;mesh&#xff09; 2.4 三維曲面圖&#xff08;surf&#xff09; 3. 參數曲面…

Linux 服務部署:自簽 CA 證書構建 HTTPS 及動態 Web 集成

Linux 服務部署&#xff1a;自簽 CA 證書構建 HTTPS 及動態 Web 集成 一、HTTPS基礎原理 HTTPS是HTTP協議基于SSL/TLS協議的加密版本&#xff0c;核心差異及握手過程如下&#xff1a;HTTP與HTTPS對比協議傳輸方式端口核心特點HTTP明文傳輸80無加密&#xff0c;安全性低HTTPS數據…

Python3.10 + Firecrawl 下載公眾號文章

獲取Firecrawl apikey 打開官網&#xff0c;使用github賬號登錄 https://www.firecrawl.dev/ 進入個人中心 https://www.firecrawl.dev/app/api-keys 使用PyCharm創建python項目 創建.env # API配置 FIRECRAWL_API_KEYfc-9*********0816d5ac6b20 # 輸出配置 OUTPUT_DIRout…

IoT/透過oc_lwm2m/boudica150 源碼中的AT指令序列,分析NB-IoT接入華為云物聯網平臺IoTDA的工作機制

文章目錄概述指令調用順序具體接入指令分析ATE0 關閉回顯ATQREGSWT 設置&#xff08;平臺&#xff09;注冊模式ATQLWSREGIND0 手動注冊平臺set_autoconnect / ATNCONFIGATNBANDx,xset_plmn / ATCOPS_set_apn / ATCGDCONT(安全)接入參數 CDPDTLSPSKATNNMI 設置新消息指示_check_…

Android UI(一)登錄注冊 - Compose

UI - 登錄注冊 - Compose一、聲明式UI1. **顛覆傳統開發模式**2. **技術優勢**3. **開發效率提升**4. **未來生態方向**5. **實際影響**二、創建項目1. Compose UI結構2. Scaffold3. 可組合函數三、創建組件頁面1. LoginPage2. RegisterPage3. MainPage四、導航1. 添加依賴2. 使…

分享10個ai生成ppt網站(附ai生成ppt入口)

實測對比&#xff1a;15頁PPT從3小時壓縮到3分鐘的秘密武器 當ChatGPT能寫方案、Midjourney能畫圖&#xff0c;做PPT還在手動排版就OUT了&#xff01;這些AI生成PPT網站已實現「輸入文案秒出設計稿」&#xff0c;無論職場匯報、畢業答辯還是路演融資&#xff0c;零設計基礎也能…

最強開源視頻模型通義萬相wan2.1在comfyui中的安裝應用詳解

摘要&#xff1a;阿里巴巴開源通義萬相Wan2.1模型&#xff0c;支持文生視頻、圖生視頻等多種功能&#xff0c;并整合關鍵環節簡化創作流程。官方和Kiji版本需配套使用各自工作流。低顯存顯卡可使用GGUF模型解決方案&#xff0c;最低適配4G顯存。ComfyUI已原生支持該模型&#x…

機器學習:基于OpenCV和Python的智能圖像處理 實戰

機器學習&#xff1a;基于OpenCV和Python的智能圖像處理實戰——待填坑圖像處理基礎圖像的基本表示方法圖像處理的基本操作圖像運算圖像的色彩空間轉換圖像幾何變換4.1 仿射變換4.2 重映射4.3 投影變換 4.4 極坐標變換5 圖像直方圖處理7 圖像閾值處理8 圖像形態學處理github地址…

proteus實現簡易DS18B20溫度計(stm32)

一、新建proteus工程 具體看前面文章 二、搭建電路 需要配置供電網絡以及尋找元器件&#xff0c;細節看前面文章&#xff0c;下面給出電路圖 電路包含了五個部分&#xff1a; 1、DS18B20&#xff1a;數據引腳記得上拉 2、stm32電路 3、串口電路&#xff08;右下角那個器件…

Autoppt-AI驅動的演示文稿生成工具

本文轉載自&#xff1a;Autoppt-AI驅動的演示文稿生成工具 - Hello123工具導航 ** 一、 Autoppt&#xff1a;AI 驅動的智能演示文稿生成工具 Autoppt 是一款基于人工智能的在線演示文稿生成平臺&#xff0c;通過輸入主題或上傳文檔&#xff08;Word/PDF/ 圖片等&#xff09;&…

Flink on YARN啟動全流程深度解析

Flink on YARN 模式啟動流程及核心組件協作詳解整個過程分為三個主要階段&#xff1a;??JobManager 啟動??&#xff08;作業提交與 AM 初始化&#xff09;??TaskManager 資源分配與啟動????任務部署與執行??第一階段&#xff1a;作業提交與 JobManager (AM) 啟動?…

安卓開發者自學鴻蒙開發1基礎入門

1.基礎 聲明式UI&#xff1a;?? ??核心&#xff1a;?? 你??聲明??你想要UI是什么樣子&#xff08;在build()方法里描述&#xff09;&#xff0c;而不是一步步命令式地創建和操作View對象&#xff08;findViewById, setText, setOnClickListener&#xff09;。 模塊化…