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"的概念詳解:
-
政治和組織:在政治和組織上,"delegate"通常指的是代表或代表團。代表是被選舉或被委派的人,負責代表某個團體、組織或國家的利益或意見。代表可以參加會議、討論和決策,并就相關議題發表意見。例如,在政治選舉中,代表可以代表選民投票,代表選民的意愿。
-
編程:在計算機編程中,"delegate"是一種編程模式,它允許將方法作為參數傳遞給其他方法。它是一種將方法調用委托給其他方法的方式。委托可以用于實現事件處理、回調函數和多線程編程等場景。通過委托,可以將方法作為對象傳遞,并在需要時調用該方法。
-
國際會議和活動:在國際會議和活動中,"delegate"是指參加會議或活動的代表或代表團成員。代表通常是為了代表特定的組織、國家或利益而參加會議或活動的人。他們可以參與會議的討論、提出建議并與其他代表交流。
-
經濟和商業:在商業領域中,"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 中,委托常用于自定義視圖控件的顯示方式和交互行為,通過實現委托類可以對每個元素進行個性化的定制。