深入解析C++11委托構造函數:消除冗余初始化的利器

一、傳統構造函數的痛點

在C++11之前,當多個構造函數需要執行相同的初始化邏輯時,開發者往往面臨兩難選擇:

class DataProcessor {std::string dataPath;bool verbose;int bufferSize;
public:// 基礎版本DataProcessor(const std::string& path) : dataPath(path), verbose(false), bufferSize(1024) {validatePath();}// 帶詳細設置的版本DataProcessor(const std::string& path, bool verb, int bufSize): dataPath(path), verbose(verb), bufferSize(bufSize) {validatePath();  // 重復初始化代碼checkBufferSize();}
};

存在的三大問題??:

  1. 初始化代碼重復
  2. 修改時需要多處同步
  3. 可維護性降低

二、委托構造函數的核心語法

2.1 基本形式

class ClassName {
public:ClassName(參數列表1) : ClassName(委托參數) { /*附加邏輯*/ }ClassName(參數列表2) { /*主構造函數*/ }
};

2.2 實際應用示例

class NetworkConnection {std::string address;int port;int timeout;bool encrypted;void initSecurity() { /* 通用初始化 */ }
public:// 主構造函數NetworkConnection(const std::string& addr, int p, int t, bool enc): address(addr), port(p), timeout(t), encrypted(enc) {initSecurity();}// 委托構造:默認超時NetworkConnection(const std::string& addr, int p) : NetworkConnection(addr, p, 5000, false) {}// 委托構造:默認端口NetworkConnection(const std::string& addr): NetworkConnection(addr, 8080) {}
};

三、執行流程解析

class Demo {int a, b, c;
public:Demo(int x) : Demo(x, x*2) {  // 步驟1:委托給兩參數構造c = x * 3;                // 步驟3:執行附加邏輯}Demo(int x, int y) : a(x), b(y) {  // 步驟2:執行主構造validateValues();}
};

執行順序??:

  1. 委托構造函數的初始化列表
  2. 目標構造函數的初始化列表
  3. 目標構造函數的函數體
  4. 委托構造函數的函數體

四、典型應用場景

4.1 默認參數構造

class FileHandler {std::filesystem::path filePath;std::ios::openmode mode;
public:FileHandler(const std::string& path, std::ios::openmode m): filePath(path), mode(m) { verifyAccess(); }FileHandler(const std::string& path): FileHandler(path, std::ios::in | std::ios::binary) {}
};

4.2 參數驗證中心化

class TemperatureSensor {double minTemp, maxTemp;void validateRange() {if (minTemp >= maxTemp) throw std::invalid_argument("...");}
public:TemperatureSensor(double min, double max): minTemp(min), maxTemp(max) { validateRange(); }TemperatureSensor(double singleTemp): TemperatureSensor(singleTemp-5, singleTemp+5) {}
};

4.3 工廠模式支持

class Product {
protected:Product(int baseParam) { /* 基礎初始化 */ }
public:static Product createA() { return Product(1); }static Product createB() { return Product(2); }
};

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

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

相關文章

LeetCode 熱題 100 189. 輪轉數組

LeetCode 熱題 100 | 189. 輪轉數組 大家好,今天我們來解決一道經典的算法題——輪轉數組。這道題在LeetCode上被標記為中等難度,要求我們將數組中的元素向右輪轉 k 個位置。下面我將詳細講解解題思路,并附上Python代碼實現。 問題描述 給定…

GAEA商業前景和生態系統擴展

GAEA情感坐標系不僅增強了AI對人類情感的理解,也為Web3生態注入了新的活力。通過去中心化的數據存儲和共享,GAEA構建了一個開放透明的數據市場,為AI訓練提供了優質的數據源。同時,貢獻數據的用戶將獲得靈魂積分(SOUL P…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: [2]如何使用跨平臺消息框?

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

js逆向繞過指紋識別

??一、兼容性說明?? 官方支持 curl_cffi 明確支持 Windows 平臺,并提供了預編譯的安裝包。其核心功能(如瀏覽器指紋模擬、HTTP/2 支持)在 Windows 上與 Linux/macOS 表現一致。 版本要求 ? Python 3.8 及以上版本(推薦 Pyth…

聊聊對Mysql的理解

目錄 1、Sql介紹 1.1、SQL的分類 1.2、數據庫的三大范式 1.3、數據表的約束 1.4、約束的添加與刪除 2、核心特性 3、主要組件 4、數據結構原理 5、索引失效 6、常用問題 7、優勢與局限 前言 MySQL是一個開源的關系型數據庫管理系統(RDBMS),由瑞典MySQL A…

[HOT 100] 1617. 統計子樹中城市之間最大距離

文章目錄 1. 題目鏈接2. 題目描述3. 題目示例4. 解題思路5. 題解代碼6. 復雜度分析 1. 題目鏈接 1617. 統計子樹中城市之間最大距離 - 力扣(LeetCode) 2. 題目描述 給你 n 個城市,編號為從 1 到 n 。同時給你一個大小為 n-1 的數組 edges &…

接口自動化——參數化

之前有說過,通過pytest測試框架標記參數化功能可以實現數據驅動測試。數據驅動測試使用的文件主要有以下類型: txt 文件 csv 文件excel 文件json 文件yaml 文件.... 本文主要講的就是以上幾種文件類型的讀取和使用 一.txt 文件讀取使用 首先創建一個 …

游戲引擎學習第257天:處理一些 Win32 相關的問題

設定今天的工作計劃 今天我們本來是打算繼續開發性能分析器(Profiler),但在此之前,我們認為有一些問題應該先清理一下。雖然這類事情不是我們最關心的核心內容,但我們覺得現在是時候處理一下了,特別是為了…

實驗三 觸發器及基本時序電路

1.觸發器的分類?各自的特點是什么? 1 、 D 觸發器 特點:只有一個數據輸入端 D ,在時鐘脈沖的觸發沿,輸出 Q 的狀態跟隨輸入端 D 的 狀態變化,即 ,功能直觀,利于理解和感受…

硬件加速模式Chrome(Edge)閃屏

Chrome開啟“硬件加速模式”后,打開瀏覽器會閃屏或看視頻會閃屏,如果電腦只有集顯,直接將這個硬件加速關了吧,沒啥必要開著 解決方法 讓瀏覽器使用獨立顯卡 在Windows左下角搜索 圖形設置 ,將瀏覽器添加進去&#…

前端工程化利器:Node.js 文件匹配庫 fast-glob 完全指南——比傳統方案快 350% 的「文件搜索神器」

為什么需要 fast-glob? 在前端工程化場景中,文件匹配是高頻操作:自動化構建、資源打包、靜態資源管理等都依賴高效的路徑匹配。傳統的 node-glob 雖然功能齊全,但性能瓶頸明顯。fast-glob 應運而生——它以 極簡 API 和 超高性能…

React class 的組件庫與函數組件適配集成

如果你有一個 基于 React class 的組件庫,現在需要在 React hooks 函數組件中使用,你可以通過以下幾種方式實現適配和集成: 數據生命周期確保 class 組件使用 React.forwardRef 導出(或手動綁定 ref) ? 1. 直接使用 c…

Sway初體驗

Sway(縮寫自 SirCmpwn’s Wayland compositor[1])是一款專為 Wayland 設計的合成器,旨在與 i3 完全兼容。根據官網所述: Sway 是 Wayland 的合成器,也是 x11 的 i3 窗口管理器的替代品。它可以根據您現有的 i3 配置工作…

dubbo 參數校驗-ValidationFilter

org.apache.dubbo.rpc.Filter 核心功能 攔截RPC調用流程 Filter是Dubbo框架中實現攔截邏輯的核心接口,作用于服務消費者和提供者的作業鏈路,支持在方法調用前后插入自定義邏輯。如參數校驗、異常處理、日志記錄等。擴展性機制 Dubbo通過SPI擴展機制動態…

Lesson 16 A polite request

Lesson 16 A polite request 詞匯 park n. 公園,停車場,莊園 v. 停車,泊車 例句:讓我來停車。    Let me park. 相關:spot n. 車位 區別:garden n. 花園 [小,私家的] 例句:我們…

解決 Builroot 系統編譯 perl 編譯報錯問題

本文提供一種修復 Builroot 系統編譯 perl 編譯報錯途徑 2025-05-04T22:45:08 rm -f pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/ln -s perldelta.pod pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/gcc -c -DPERL_CORE -fwrapv -fpcc-struct-return -pipe -f…

Spring MVC 中解決中文亂碼問題

在 Spring MVC 中解決中文亂碼問題,需要從 請求參數編碼 和 響應內容編碼 兩方面入手。以下是完整的解決方案: 一、解決請求參數中文亂碼 1. POST 請求編碼(表單提交) 配置 CharacterEncodingFilter 在 web.xml 中添加 Spring 提…

MYSQL數據庫突然消失

之前在下載mysql時發現沒有my.ini。考慮到后面的項目可能需要,看著教程自己創建了一次,當時就發生了所有數據庫消失的問題,近幾天這種事件又發生了。我在服務里看到我有mysql和mysql57兩個服務,啟動一個的時候另一個就無法啟動&am…

【Spring】idea + maven 從零創建Spring IoC容器示例

【Spring】idea maven 從零創建Spring IoC容器示例 1. 環境準備2. 創建maven項目3. 添加依賴4. 創建Java類與接口4.1 定義接口UserService4.2 實現接口UserServiceImpl 5. 配置Spring IoC容器6. 編寫主類調用IoC容器擴展:使用注解方式實現IoC1. 修改beans.xml2.使用…

面試回答之STAR結構

面試回答之STAR結構 1. STAR結構的起源 STAR是行為面試法(Behavioral Interview)的核心框架,由以下四個單詞首字母組成: ? Situation(情境) ? Task(任務) ? Action&#xff…