委托构造函数详解,小白也可以看懂

2023-11-05

什么是委托构造函数

当我还不知道这个东西的时候,看到名字,顾名思义,我理解为委托其他构造函数帮忙构造。

这和定义也是相近的!

C++11 引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函 数,从而达到简化代码的目的

为什么要有委托构造函数?

避免你有多个参数表不同但是逻辑相近(或者有公共部分)的构造函数的时候,一个逻辑写好几遍造成代码重复。

这里要更好的理解,需要将一个故事

如图1, 班主任要求A、B、C三位同学完成将各自资料送交办公室任务.(C++中初始化成员) ,虽然三位同学手中的资料不同(各成员列表), 但是需要完成的操作是相同的(初始化), 都是送往办公室。按照C++98的做法, 则需要A、B、C三位同学各自重复相同操作。这显示是不必要的. 对于C++11, 完全可以将这个工作委托给一个同学(充当目标构造函数, 后面会专门将到)去间接完成, 这样便省去了大量的重复性劳动。

在这里插入图片描述

委托构造函数也是构造函数, 因此, 构造函数的特性都适合委托构造函数, 比如: 没有返回值, 可以有一个或多个参数, 有函数体等。委托构造函数也有一个成员初始值列表和函数体。 在委托构造函数内, 成员初始值列表的唯一入口便是类名本身。然后紧接着是以圆括号围起来的参数列表, 这些参数列表必须与类中的另外一个构造函数相匹配。

代码讲解

#include"entrusted_construction.h"


/*******************************************************************************************************
//委托构造函数
C++11 引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函
数,从而达到简化代码的目的。
*******************************************************************************************************/

#include <iostream>
class Base 
{
public:
	int value1;
	int value2;
	Base()    //目标构造函数
	{
		value1 = 1;
	}
	Base(int value) : Base()  //委托构造函数
	{ // 委托 Base() 构造函数
		value2 = value;
	}
};
void EntrustedConstruction()
{
	Base b(2);  //首先调用Base(int value) : Base() 毫无疑问
    //然后会走到base()中,先给value1复制,然后走到Base(int value) : Base() ,给value2赋值
	std::cout << b.value1 << std::endl;
	std::cout << b.value2 << std::endl;
}

运行结果:

在这里插入图片描述

注意事项

1.不能出现”委托环“

所谓 委托环(delegation cycle) 是指某类中有一个若多个委派构造函数, 然后在这些若干个的委派构造函数中, 某些目标构造函数可能同时是委派构造函数。 这样一来, 委派构造函数形成了一个链状结构(如链表的首尾相连情况.), 这就是所谓的“委托环”。

2.构造函数不能同时“委派”和使用初始化列表

参考链接

聊一聊,什么是C++11新特性之“委托构造函数”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

委托构造函数详解,小白也可以看懂 的相关文章

随机推荐

  • 深度学习速成(5)torch.nn.Module类

    nn Module 是PyTorch中的一个基础类 nn即是Neural Networks 用于构建神经网络模型 所有的神经网络模型都必须继承于nn Module类 并实现 forward 方法来定义模型的前向传播过程 nn Module类
  • nginx 配置静态网页

    nginx 配置静态网页 进入配置文件 etc nginx conf d default conf 配置的时候小伙伴们一定要记得先备份一份文件 这样方便后续出错恢复 server listen 端口号 server name IP loca
  • 解决Springboot GET请求参数过长的情况

    项目场景 使用Spring Boot进行项目开发 解决Springboot GET请求参数过长的情况 问题描述 报错信息 Springboot GET请求参数过长抛出异常 Request header is too large 的问题 现象
  • 华为OD机试 - 冠亚军排名,奖牌榜排名(Java)

    题目描述 2012伦敦奥运会即将到来 大家都非常关注奖牌榜的情况 现在我们假设奖牌榜的排名规则如下 首先gold medal数量多的排在前面 其次silver medal数量多的排在前面 然后bronze medal数量多的排在前面 若以上
  • 2022-12-27 使用lodash库实现两个非空对象的深拷贝并输出这两个对象的并集

    问题描述 遇到这样一个题 如下 const a fruits apple banana series apple C banana A B const b fruits banana orange animals pig series ba
  • ESP32S系列芯片通过EC20完成OTA统一流程

    uint32 t end size 0 最后一包的大小 uint16 t page number 0 总包数 uint16 t now number 0 当前写入页数 uint32 t bin addr 0 文件地址指针偏移量 uint16
  • DSMM数据安全概述

    数据安全生命周期分为采集 传输 存储 处理 交换 销毁几个阶段 其中数据处理阶段是整个周期的核心阶段 数据处理安全与否直接关系到整体数据安全 那么今天分享内容就是数据处理安全的相关要求和实现目标 DSMM是Data Security cap
  • URP学习--LitShader

    我们来看一下URP下的LitShader LitShader也是基于物理渲染的 很多方法和属性看过默认管线PBR代码的应该都会很熟悉 我们现在再过一遍 加深一下印象 同时疏通一下以前可能没有掌握的地方 先看Shader的Properties
  • mysql workbench 建库建表

    选择Create Schema建库 选择Create Table建表 改表名 上拉箭头选择更多 此处最好全屏 不然显示不全
  • UE5实现物体高亮描边效果(含UE相关源码浅析)

    文章目录 1 实现目标 2 实现过程 2 1 UE Editor中相关源码 2 2 深度值描边 2 3 半透明材质处理 2 4 遮挡处理 2 5 视口边缘处理 3 参考资料 1 实现目标 在UE5中实现物体边缘高亮效果 且在被遮挡时在边缘显
  • Android报Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0 .解决办法

    如果遇到这个问题 首先考虑以下原因 你是否在setText 方法中设置了一个int型变量 比如setText 10 这样Android系统就会主动去资源文件当中寻找 但是它不是一个资源文件ID 所以就会报出这个bug 解决办法 将int型业
  • 多维时序

    多维时序 MATLAB实现LSTM长短期记忆神经网络多变量时间序列预测 考虑历史特征的影响 多指标 多图输出 目录 多维时序 MATLAB实现LSTM长短期记忆神经网络多变量时间序列预测 考虑历史特征的影响 多指标 多图输出 效果一览 基本
  • linux - 文件利用率快满了 - mongo日志

    https zhuanlan zhihu com p 82430795 查看文件利用率 df h 文件夹大小 ls lh 逐级搜索大文件或目录 du sh cd 返回上一层 ps ef grep mongo 启动 mongodb bin m
  • 布尔值(python)

    while语句 格式 while 表达式 语句 逻辑 当程序执行到while语句时 首先计算表达式的值 如果表达式的值为假 那么结束整个while语句 如果为真 则先执行语句 再去计算表达式的值 如果表达式的值为假 那么结束整个while语
  • 从匿名函数到函数式编程

    什么是匿名函数 匿名函数是一种没有名称的函数 也被称为 lambda 函数或者函数字面量 和普通函数不同 匿名函数不需要在定义时指定函数名 通常是在需要的时候直接定义和使用 匿名函数通常被用作一次性的函数 例如作为其他函数的参数或者返回值
  • IDEA调试技巧

    在项目开发的时候很多小伙伴能非常熟练的使用IDEA编写代码 但是对于IDEA调试的技巧掌握的不是很好 只会F7 F8 F9等这些基本调试功能 而像一些复杂的调试场景就无从下手 如 在for循环中调试某个特定值 修改变量的运行值等 本文介绍了
  • Kubernetes 动态分配存储卷之 NFS-Subdir-External-Provisioner

    NFS Provisioner 已经停止维护 现在新的 NFS 动态分配器已经切换为 NFS Subdir External Provisioner 该组件也是一个自动配置卷程序 它使用现有的和已配置的 NFS 服务器来支持通过持久卷声明动
  • 二、C++语言初阶:类与对象

    2 类与对象 2 1 认识类与对象 什么是类 class 类 class 是类型 type 是用户自定义的类型 为什么不叫它type 因为借用Simula语言中的class关键字 为什么要有类 基于便利性的考虑 现实世界中物 object
  • 本地连腾讯云CentOS7主机Unable to connect to Redis异常

    问题描述 SpringBoot集成Redis操作 Unable to connect to Redis异常 1 yml中的spring redis的host和port配置无误 2 云主机的6379端口开放 3 redis conf配置文件b
  • 委托构造函数详解,小白也可以看懂

    委托构造函数 什么是委托构造函数 为什么要有委托构造函数 代码讲解 注意事项 参考链接 什么是委托构造函数 当我还不知道这个东西的时候 看到名字 顾名思义 我理解为委托其他构造函数帮忙构造 这和定义也是相近的 C 11 引入了委托构造的概念