C++笔记之Delegate和委托构造(Delegating constructor)

C++笔记之Delegate和委托构造辨析

code review!

—— 杭州 2023-12-10


参考博文:C++笔记之文档术语——将可调用对象作为函数参数

文章目录

  • 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:
    // 构造函数1
    MyClass() : MyClass(0, 0) {
        std::cout << "Default constructor" << std::endl;
    }

    // 构造函数2
    MyClass(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: 20

    return 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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/239768.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python异常、模块和包

Python异常、模块和包 1.了解异常2.异常的捕获方法3.异常的传递4.Python模块5.Python包 1.了解异常 1.1什么是异常 当检测到一个错误是&#xff0c;Python解释器就无法继续执行了&#xff0c;发而出现了一些错误提示&#xff0c;这就是所谓的“异常”&#xff0c;也就是我们常…

橡胶塑料企业网站建设的作用是什么

橡胶塑料产品一般属于大额交易&#xff0c;对企业来说&#xff0c;需要不断提升品牌和拓客&#xff0c;但如今线下信息传播力不足&#xff0c;难以全面呈现内容&#xff0c;需要商家不断提升线上能力&#xff0c;获得进一步发展。 1、品牌宣传展示难 线上没有自己的平台难以将…

HTML---列表.表格.媒体元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.列表 无序列表 HTML中的无序列表&#xff08;Unordered List&#xff09;用于显示一组项目&#xff0c;每个项目之前没有特定的顺序或编号。无序列表使用<ul>标签来定义&#xff0c;每…

MTK Android P Sensor架构(一)

需求场景&#xff1a; 本来如果只是给传感器写个驱动并提供能读取温湿度数据的节点&#xff0c;是一件比较轻松的事情&#xff0c;但是最近上层应用的同事要求我们按照安卓标准的流程来&#xff0c;这样他们就能通过注册一个服务直接读取传感器事件数据了。这样做的好处就是第…

初始数据库 - 了解数据库

centos 7 版本当中安装 mysql 安装与卸载中&#xff0c;⽤⼾全部切换成为root&#xff0c;⼀旦 安装&#xff0c;普通⽤⼾是可以使用的。 卸载不需要的环境 首先&#xff0c;在安装之前&#xff0c;要先确定你当前系统当中是否已经有了mysql 的环境&#xff0c;如果你不想卸…

1838_emacs_evil中跳转到任意字符evil-avy-goto-char的功能分析

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 1838_emacs_evil中跳转到任意字符evil-avy-goto-char的功能分析 avy是一个比较成熟的emacs的插件&#xff0c;可以实现快速跳转到指定的字符位置的功能…

数据在网络中是怎么传输的?

计算机通信场景大致如下所示&#xff1a; 1.同一个子网中两台计算机通信 2.不属于同一个子网&#xff0c;两台计算机进行通信 以下内容&#xff0c;将围绕这两种场景进行阐述&#xff0c;在阐述之前&#xff0c;先举个场景示例&#xff0c;帮助大家理解一些名词 场景一&…

机器学习---Boosting

1. Boosting算法 Boosting思想源于三个臭皮匠&#xff0c;胜过诸葛亮。找到许多粗略的经验法则比找到一个单一的、高度预 测的规则要容易得多&#xff0c;也更有效。 预测明天是晴是雨&#xff1f;传统观念&#xff1a;依赖于专家系统&#xff08;A perfect Expert) 以“人无…

Reinfocement Learning 学习笔记PartⅠ

文章目录 Reinfocement Learning一、基本概念二、贝尔曼公式&#xff08;bellman equation&#xff09;2.1 为什么return重要2.2 state value function的定义2.3 贝尔曼公式推导2.4 如何求解贝尔曼公式2.5 Action value的定义 三、贝尔曼最优公式&#xff08;bellman optimalit…

HarmonyOS—实现UserDataAbility

UserDataAbility接收其他应用发送的请求&#xff0c;提供外部程序访问的入口&#xff0c;从而实现应用间的数据访问。Data提供了文件存储和数据库存储两组接口供用户使用。 文件存储 开发者需要在Data中重写FileDescriptoropenFile(Uriuri,Stringmode)方法来操作文件&#xf…

在做题中学习(32):只出现一次的数字 III

260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09; 根据题目可知&#xff1a;有两个元素只出现一次&#xff0c;其余出现两次。 而在只出现一次的数字 I 里&#xff0c;只有一个元素出现一次&#xff0c;可以用异或的方式直接得到最后的答案&#xff0c;而此…

PaddleOCR:超越人眼识别率的AI文字识别神器

在当今人工智能技术已经渗透到各个领域。其中&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;技术将图像中的文字转化为可编辑的文本&#xff0c;为众多行业带来了极大的便利。PaddleOCR是一款由百度研发的OCR开源工具&#xff0c;具有极高的准确率和易…

Linux嵌入式配置USB鼠标支持+触摸板

在linux嵌入式中加入鼠标支持&#xff0c;首先在内核里面将mice驱动加入编译&#xff0c;这里用到的是usb所以还要有usb的支持&#xff0c;下载到板子上启动 1、定位鼠标 要用鼠标&#xff0c;首先要知道生成的鼠标设备是哪个&#xff0c;直接直接ls input目录&#xff0c;当…

2023.12.6-12.11 黑马知行教育项目实战,访问咨询意向线索主题

目录 简单介绍: 一.项目背景介绍 二.项目架构介绍 三.项目内容 3.1访问和咨询分析主题: 3.1.1 表与表之间的关联 3.1.2访问咨询主题需求汇总:最终需在ADS层制作六张表 3.1.3 访问咨询DWS大宽表建表与导入数据 3.2意向线索主题需求分析 3.2.1意向线索主题需求汇总:最终需在…

【数据结构(六)】希尔排序、快速排序、归并排序、基数排序的代码实现(3)

文章目录 1. 希尔排序1.1. 简单插入排序存在的问题1.2. 相关概念1.3. 应用实例1.3.1. 交换法1.3.1.1. 逐步推导实现方式1.3.1.2. 通用实现方式1.3.1.3. 计算时间复杂度 1.3.2. 移动法 2. 快速排序2.1. 相关概念2.2. 实例应用2.2.1. 思路分析2.2.2. 代码实现 2.3. 计算快速排序的…

华清远见作业第二十五天

使用三个程序来完成输出ABCABCABCABCABC #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/sem.h>#define NUM_SEMS 3 // 信号量集中的信号量数量union semun {int val;struct semid_ds *…

隔离电源与非隔离式电源

开关电源 文章目录 开关电源前言一、它们之间的区别是什么&#xff1f;二、如何区分它们呢&#xff1f;三、隔离电源与非隔离电源的优缺点四、隔离电源与非隔离电源的选择总结 前言 在产品设计时&#xff0c;倘若没有考虑应用环境对电源隔离的要求&#xff0c;产品到了应用时就…

Linux服务器安装vim命令

1、查看是否安装vim命令 vim /etc/hosts2、检查系统中是否存在安装包 rpm -qa|grep vim2、 安装vim yum -y install vim*4、测试是否安装成功 vim /etc/hosts

深度学习——第3章 Python程序设计语言(3.7 matplotlib库)

3.7 matplotlib库 目录 1 matplotlib库简介 2 pyplot的plot函数 3 matplotlib基础绘图函数示例 数据可视化有助于深度理解数据。 本节介绍绘制图形的基本方法。 1. matplotlib库简介 matplotlib官网 1.1 matplotlib库概述 matplotlib是Python优秀的数据可视化第三方库&a…

Python 神奇解码器:pyWhat 库全面指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今数字化的世界中&#xff0c;理解和处理文本数据是许多应用程序的关键任务。而PyWhat库作为一个用于处理文本的Python库&#xff0c;提供了强大的功能&#xff0c;帮助开发者在文本中识别和提取有意义的信息…