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.hqwc.cn/news/264676.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维码智慧门牌管理系统升级解决方案:数字化房产管理

文章目录 前言一、全面信息记录&#xff1a;提升管理效率二、多种优势功能&#xff1a;系统化管理与无缝对接三、安全隐私保护&#xff1a;数据安全的重要性四、总结&#xff1a;提升管理效率与居住体验 前言 科技驱动房产管理 随着科技的飞速发展&#xff0c;房产管理领域也面…

力扣每日一题day33[111. 二叉树的最小深度]

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#xff1a; 输入…

Day56力扣打卡

打卡记录 数对统计&#xff08;DP状态压缩&#xff09; 参考文献 #include <bits/stdc.h>using namespace std;void solve(){int n;cin >> n;map<int, int> mapp;vector<int> a(n);for (auto& x : a){cin >> x;mapp[x] ;}vector<array&…

探索HarmonyOS_开发软件安装

随着华为推出HarmonyOS NEXT 宣布将要全面启用鸿蒙原声应用&#xff0c;不在兼容安卓应用&#xff0c; 现在开始探索鸿蒙原生应用的开发。 HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 鸿蒙官网 开发软件肯定要从这里下载 第一个为微软系统(windows)&#xff0c;第…

深度学习 | Pytorch深度学习实践 (Chapter 12 Basic RNN)

十二、Basic RNN —— 实际上就是对线性层的复用 使用RNN最重要的两点&#xff1a; 了解序列数据的维度&#xff1b;循环过程所用的权重共享机制&#xff1b; 一般就是自己写个循环&#xff0c;权重层重复用就行了&#xff1b; 回顾&#xff1a;-----------------------------…

Spring Cloud gateway - CircuitBreaker GatewayFilte

前面学习Spring cloud gateway的时候&#xff0c;做测试的过程中我们发现&#xff0c;Spring Cloud Gateway不需要做多少配置就可以使用Spring Cloud LoadBalance的功能&#xff0c;比如&#xff1a; spring:application:name: spring-gatewaycloud:gateway:routes:- id: path…

DSP外部中断笔记

中断原理 三部分 注意 &#xff0c;外部中断使能&#xff0c;PIE使能&#xff0c;CPU中断使能 外部中断有7个&#xff0c;PIE有12组&#xff0c;一个组有8个中断复用。只有一个CPU中断可执行。 外部中断原理 1、外部中断概述 外部中断结构图 外部中断XINT1对应的是0到31GPIO…

C/C++常见面试题(二)

接前面C/C常见面试题&#xff08;一&#xff09;&#xff0c;继续巩固 目录 1 sizeof和strlen的区别 2 宏定义的陷进 3 不使用sizeof计算出类型或者变量所占的内存的字节数 4 给定一个数判断是否其是2的N次幂 5 C/C打印所在文件、行号、函数、日期&#xff0c;时间、遵循的…

Android P 9.0 增加以太网静态IP功能

效果图 一、Settings添加以太网的配置&#xff1a; 1、vendor\mediatek\proprietary\packages\apps\MtkSettings\res\xml\network_and_internet.xml <com.android.settingslib.RestrictedPreferenceandroid:key"ethernet_settings"android:title"string/et…

TailwindCSS 配置可视化检查器

问题 TailwindCSS 框架为我们提供了大量默认的类和属性&#xff0c;而且开发者也能够自定义类和配置。 对于初学者来说&#xff0c;这些配置其实是比较复杂的&#xff0c;这也是tailwindcss最大的入手成本&#xff0c;开发者的记忆负担和心智负担也都比较大。 有没有办法能够…

C语言动态内存经典笔试题分析

C语言动态内存经典笔试题分析 文章目录 C语言动态内存经典笔试题分析1. 题目一2. 题目二3. 题目三4. 题目四 1. 题目一 void GetMemory(char *p){p (char *)malloc(100);} void Test(void){char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str)…

html通过CDN引入Vue使用Vuex以及Computed、Watch监听

html通过CDN引入Vue使用Vuex以及Computed、Watch监听 近期遇到个需求&#xff0c;就是需要在.net MVC的项目中&#xff0c;对已有的项目的首页进行优化&#xff0c;也就是写原生html和js。但是咱是一个写前端的&#xff0c;写html还可以&#xff0c;.net的话&#xff0c;开发也…