C++筆記之Delegate和委托構造(Delegating constructor)

C++筆記之Delegate和委托構造辨析

code review!

—— 杭州 2023-12-10


文章目錄

  • C++筆記之Delegate和委托構造辨析
    • 0.有道詞典:英語發音
    • 1.ChatGPT:delegate概念詳解
    • 2.Delegate和“將可調用對象作為函數參數”是不是一回事?
    • 3.C++的Delegate示例
    • 4.委托構造(Delegating constructor)
    • 5.cppreference:Delegating constructor
    • 5.Delegate在Qt中的應用
    • 6.C++之父在《The C++ Programming Language》一書中的描述:17.4.3 Delegating Constructors

圖片名稱

0.有道詞典:英語發音

在這里插入圖片描述

1.ChatGPT:delegate概念詳解

在不同的領域中,"delegate"這個詞可能會有不同的含義和用法。以下是幾個常見領域中"delegate"的概念詳解:

  1. 政治和組織:在政治和組織上,"delegate"通常指的是代表或代表團。代表是被選舉或被委派的人,負責代表某個團體、組織或國家的利益或意見。代表可以參加會議、討論和決策,并就相關議題發表意見。例如,在政治選舉中,代表可以代表選民投票,代表選民的意愿。

  2. 編程:在計算機編程中,"delegate"是一種編程模式,它允許將方法作為參數傳遞給其他方法。它是一種將方法調用委托給其他方法的方式。委托可以用于實現事件處理、回調函數和多線程編程等場景。通過委托,可以將方法作為對象傳遞,并在需要時調用該方法。

  3. 國際會議和活動:在國際會議和活動中,"delegate"是指參加會議或活動的代表或代表團成員。代表通常是為了代表特定的組織、國家或利益而參加會議或活動的人。他們可以參與會議的討論、提出建議并與其他代表交流。

  4. 經濟和商業:在商業領域中,"delegate"可以指派任務或責任給其他人。這種委派常用于分配工作、管理團隊和授權他人代表特定角色或職能。委派可以幫助提高效率、分擔工作負擔并發揮團隊成員的專長。

總的來說,"delegate"一詞的核心概念是代表、委托或授權某人代表他人或組織行事。具體含義和應用根據不同的領域和上下文而有所不同。

2.Delegate和“將可調用對象作為函數參數”是不是一回事?

是的,Delegate 和將可調用對象作為函數參數是相似的概念。

Delegate(委托)是一種將方法作為參數傳遞或賦值給其他方法的機制,允許程序在運行時動態地決定要執行的代碼。在這種機制中,可調用對象可以是函數指針、函數對象、Lambda 表達式等。

將可調用對象作為函數參數是一種更一般化的概念,它允許將函數對象、Lambda 表達式等作為參數傳遞給其他函數。這樣做可以實現更靈活的函數行為,允許開發者在調用函數時指定所需的行為代碼或邏輯。

在 C++ 中,委托的實現通常涵蓋了將可調用對象作為函數參數的機制。通過使用函數指針、函數對象、Lambda 表達式等,可以將可調用對象傳遞給其他函數,實現委托的效果。這樣可以在函數調用時指定要執行的特定代碼,并允許動態地切換或定制函數的行為。

因此,Delegate 和將可調用對象作為函數參數都是關于在運行時傳遞函數或行為的機制。Delegate 更多地強調了將方法作為參數傳遞的概念,而將可調用對象作為函數參數則更廣泛地涵蓋了函數指針、函數對象、Lambda 表達式等不同類型的可調用對象。

3.C++的Delegate示例

以下是一個簡單的 C++ 委托示例:
在這里插入圖片描述
代碼

#include <iostream>// 定義委托類型
using Delegate = void (*)(const std::string&);// 委托函數
void Greet(const std::string& name) {std::cout << "Hello, " << name << "!" << std::endl;
}// 接受委托作為參數的函數
void ExecuteDelegate(Delegate delegate, const std::string& name) {delegate(name);
}int main() {// 創建委托實例Delegate delegate = Greet;// 調用委托函數ExecuteDelegate(delegate, "John");return 0;
}

在這個示例中,我們首先定義了一個委托類型 Delegate,它是一個指向函數的指針類型,接受一個 const std::string& 類型的參數并返回 void

然后,我們定義了一個名為 Greet 的函數,它符合委托類型的簽名,用于向控制臺輸出問候信息。

接下來,我們定義了一個名為 ExecuteDelegate 的函數,它接受一個委托參數和一個字符串參數,并在內部調用了傳入的委托函數。

main 函數中,我們創建了一個委托實例 delegate,將其指向 Greet 函數。然后,我們調用了 ExecuteDelegate 函數,并傳遞了委托實例和一個名字作為參數。

運行程序時,它將輸出 “Hello, John!”,即通過委托調用了 Greet 函數,并將名字作為參數傳遞給它。

這個示例展示了 C++ 中使用函數指針作為委托的簡單示例。實際上,C++ 還提供了其他更靈活和類型安全的委托機制,例如使用函數對象、Lambda 表達式、std::function 等。這些機制可以更方便地實現委托功能,并提供更多的語法糖和類型檢查。

4.委托構造(Delegating constructor)

在 C++ 中,委托構造是一種通過一個構造函數調用另一個構造函數的機制。它可以在一個構造函數中調用同一類的其他構造函數,從而避免了重復的初始化代碼。

以下是一個簡單的委托構造示例:

在這里插入圖片描述

代碼

#include <iostream>class MyClass {
private:int value1;int value2;public:// 構造函數1MyClass() : MyClass(0, 0) {std::cout << "Default constructor" << std::endl;}// 構造函數2MyClass(int v1, int v2) : value1(v1), value2(v2) {std::cout << "Parameterized constructor" << std::endl;}void PrintValues() {std::cout << "Value1: " << value1 << ", Value2: " << value2 << std::endl;}
};int main() {// 使用默認構造函數創建對象MyClass obj1;obj1.PrintValues(); // 輸出: Value1: 0, Value2: 0// 使用參數化構造函數創建對象MyClass obj2(10, 20);obj2.PrintValues(); // 輸出: Value1: 10, Value2: 20return 0;
}

在這個示例中,MyClass 類有兩個構造函數:默認構造函數和參數化構造函數。默認構造函數內部使用了委托構造的方式來調用參數化構造函數,從而避免了重復的初始化代碼。

當我們使用默認構造函數創建對象 obj1 時,它在構造過程中會委托調用參數化構造函數,并將參數設置為默認值 0。然后,它會輸出 “Default constructor” 和打印默認的值。

當我們使用參數化構造函數創建對象 obj2 時,它直接調用參數化構造函數,并將參數設置為給定的值 10 和 20。然后,它會輸出 “Parameterized constructor” 和打印給定的值。

運行程序時,輸出結果如注釋所示。

這個示例展示了 C++ 中使用委托構造的方式,通過一個構造函數調用另一個構造函數,以簡化初始化過程和避免代碼重復。

5.cppreference:Delegating constructor

在這里插入圖片描述

翻譯
在這里插入圖片描述

5.Delegate在Qt中的應用

Delegate(委托)是一個通用的編程概念,它在中文中也可以稱為"代理"或"委托者"。在軟件開發中,委托是一種將方法作為參數傳遞或賦值給其他方法的機制,從而允許程序在運行時動態地決定要執行的代碼。

委托在許多編程語言和框架中都有廣泛應用,包括 Qt。在 Qt 中,委托常常用于自定義視圖控件(如列表視圖、表格視圖等)的顯示方式。通過實現自定義的委托類,開發者可以控制和定制視圖中每個元素的顯示方式、交互行為以及其他外觀和行為相關的細節。

委托在 Qt 中通常繼承自 QAbstractItemDelegate 類,并實現一些特定的方法來定制視圖元素的顯示和交互。這些方法包括 paint()(用于繪制元素的外觀)、sizeHint()(用于指定元素的大小)、editorEvent()(用于處理元素的交互事件)等。

通過使用委托,開發者可以根據自己的需要自定義視圖中每個元素的外觀和行為。例如,可以使用委托來實現不同的顏色、字體、圖標等,或者在用戶與元素交互時觸發特定的事件和邏輯。

總之,Delegate(委托)是一種在軟件開發中常見的編程概念,用于將方法作為參數傳遞或賦值給其他方法。在 Qt 中,委托常用于自定義視圖控件的顯示方式和交互行為,通過實現委托類可以對每個元素進行個性化的定制。

6.C++之父在《The C++ Programming Language》一書中的描述:17.4.3 Delegating Constructors

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

Numpy矩陣(第16講)

Numpy矩陣(第16講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ??????????????????????????????????????????????????????????????????????????????????????????…

認識計算機的設備管理

在計算機系統中&#xff0c;除了處理器和內存之外&#xff0c;其他的大部分硬設備稱為外部設備。它包括輸入/輸出設備&#xff0c;輔存設備及終端設備等。這些設備種類繁多&#xff0c;特性各異&#xff0c;操作方式的差異很大&#xff0c;從而使操作系統的設備管理變得十分繁雜…

【數據結構】哈希表算法總結

知識概覽&#xff08;哈希表&#xff09; 哈希表可以將一些值域較大的數映射到較小的空間內&#xff0c;通常用x mod 質數的方式進行映射。為什么用質數呢&#xff1f;這樣的質數還要離2的整數冪盡量遠。這可以從數學上證明&#xff0c;這樣沖突最小。取余還是會出現沖突情況。…

《三十一》開發模式構建工具 Vite

20的40分鐘之前還沒看。 20的1小時15分 基于 Vite2。 在實際開發中&#xff0c;編寫的代碼往往是不能被瀏覽器直接識別的&#xff0c;例如 ES6、React、Vue、TypeScript 等&#xff0c;必須通過構建工具來對代碼進行轉換、編譯&#xff0c;例如 Webpack、Rolluop、Vite 等。 V…

c++模板學習筆記

模板 函數模板類模板 函數模板 函數模板的格式為&#xff1a; template<typename T1,typename T2...> 函數返回值類型 函數名(參數列表) {//函數體 }typename是定義模板參數的關鍵字&#xff0c;可以使用class來代替&#xff08;不能使用struct&#xff09; 函數模板本…

【數據結構 — 排序 — 選擇排序】

數據結構 — 排序 — 選擇排序 一.選擇排序1.基本思想2.直接選擇排序2.1算法講解2.2.代碼實現2.2.1.函數定義2.2.2.算法接口實現2.2.3.測試代碼實現2.2.4.測試展示 3.堆排序3.1.算法講解3.2.代碼實現3.2.1.函數定義3.2.2.算法接口實現3.2.3.測試代碼實現3.2.4.測試展示 一.選擇…

Docker創建mqtt容器mosquitto

#1.創建映射到主機的配置文件/bwss/agent/docker/mosquitto_public/config/mosquitto.conf 內容為&#xff1a; listener 51883 0.0.0.0 # 0.0.0.0 allow_anonymous false persistence false persistence_location /mosquitto/data password_file /mosquitto/config/passwd …

Java 8 新特性深度解析:探索 Lambda 表達式、Stream API 和函數式編程的革新之路

Java8 新特性 Java 8 的革新之路 自 1995 年首次發布以來&#xff0c;Java 已經成為世界上最廣泛使用的編程語言之一。隨著時間的推移&#xff0c;Java 經歷了多次版本更新&#xff0c;其中最具里程碑意義的便是 Java 8 的發布。這個版本引入了許多重大變革&#xff0c;包括 …

開發猿的平平淡淡周末---2023/12/10

天氣陰 溫度適宜17攝氏度 AM 昨晚竟然下小雨了&#xff0c;還好還好&#xff0c;昨天刷的兩個背包基本干了 一覺睡到日三竿&#xff0c;誰是神仙&#xff0c;我是神仙&#xff08;哈哈哈哈哈哈&#xff09; 刷會兒視頻 補充下起床的動力 洗漱&#xff0c;恰飯&#xff0c;肝…

電工--基本放大電路

電壓放大倍數、輸入電阻和輸出電阻是放大電路的三個主要性能指標 共發射極基本交流放大電路 晶體管&#xff1a;電流放大作用。能量較小的輸入信號通過晶體管的控制作用&#xff0c;去控制電源所共給的能量&#xff0c;以在輸出端獲得一個能量較大的信號 集電極電源電壓&#…

traj_dist 筆記:測量軌跡距離

python 筆記 &#xff1a;trajectory_distance包&#xff08;如何可以正確使用&#xff09;【debug篇】-CSDN博客 經過前面的debug后&#xff0c;在setup.py對應的位置&#xff0c;寫代碼&#xff08;直接在別處import traj_dist我還是出問題&#xff09; 1 新建軌跡 import…

電子學會C/C++編程等級考試2021年12月(五級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:書架 John最近買了一個書架用來存放奶牛養殖書籍,但書架很快被存滿了,只剩最頂層有空余。 John共有N頭奶牛(1 ≤ N ≤ 20,000),每頭奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000),N頭奶牛的總高度為S。書架高度為B(1 ≤ B ≤ S &…

[LeetCode周賽復盤] 第 375 場周賽20231210

[LeetCode周賽復盤] 第 375 場周賽20231210 一、本周周賽總結100143. 統計已測試設備1. 題目描述2. 思路分析3. 代碼實現 100155. 雙模冪運算1. 題目描述2. 思路分析3. 代碼實現 100137. 統計最大元素出現至少 K 次的子數組1. 題目描述2. 思路分析3. 代碼實現 100136. 統計好分…

Java中多態的一些簡單理解

什么是多態 1.面向對象的三大特性&#xff1a;封裝、繼承、多態。從一定角度來看&#xff0c;封裝和繼承幾乎都是為多態而準備的。這是我們最后一個概念&#xff0c;也是最重要的知識點。 2.多態的定義&#xff1a;指允許不同類的對象對同一消息做出響應。即同一消息可以根據發…

Linux用戶和權限

一、認知root用戶 1.1 了解什么是root用戶&#xff08;超級管理員&#xff09; root用戶&#xff08;超級管理員&#xff09; 無論是Windows、MacOS、Linux均采用多用戶的管理模式進行權限管理。 在Linux系統中&#xff0c;擁有最大權限的賬戶名為&#xff1a;root&#x…

Java9及之后關于類加載器的新特性

為了保證兼容性&#xff0c;JDK9沒有從根本上改變三層類加載器的架構和雙親委派模型&#xff0c;但為了模塊化系統的順利運行&#xff0c;仍然發生了一些值得被注意的變動。 一、變動1 由于引入了模塊化概念&#xff0c;所以不同的類加載器回去加載屬于不同模塊的類 啟動類加…

Nginx負載均衡實戰

&#x1f3b5;負載均衡組件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模塊允許Nginx定義一組或多組節點服務器組&#xff0c;使用時可以通過多種方式去定義服務器組 樣例&#xff1a; upstream backend {server back…

從零開發短視頻電商 在AWS SageMaker已創建的模型列表中進行部署

1.導航到 SageMaker 控制臺。 2.在 SageMaker 控制臺的左側導航欄中&#xff0c;選擇 “模型” 選項。 3.在模型列表中&#xff0c;找到您要部署的模型。選擇該模型。 4.點擊 “創建端點” 選項或者點擊 “創建端點配置” 選項都可以進行部署。 選擇創建端點進去后還是會進行…

k8s中部署基于nfs的StorageClass

部署nfs服務 1.1 創建基礎鏡像(選做) 如果以docker的形式部署nfs server, 參考此步驟, 若否, 該步驟可忽略。 mkdir /data/nfs -p chmod 755 /data/nfs# NFS默認端口: 111、2049、20048 docker run -d \ --privileged \ --name nfs_server \ -p 111:111/tcp \ -p 111:111/ud…

[CTFshow 紅包挑戰] 刷題記錄

文章目錄 紅包挑戰7紅包挑戰8紅包挑戰9 紅包挑戰7 考點&#xff1a;xdebug拓展 源碼 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd s…