【C++11保姆级教程】列表初始化(Literal types)和委派构造函数(delegating))

news2024/9/24 17:53:48

文章目录

  • 前言
  • 一、列表初始化 (List Initialization)
    • 1.1数组初始化
    • 1.2结构体初始化
    • 1.3容器初始化
    • 1.4列表初始化的优势
  • 二、委派构造函数 (Delegating Constructors)
    • 2.1委派构造函数是什么?
    • 2.2委派构造函数示例代码
    • 2.3调用顺序
    • 2.3委派构造函数优势
  • 总结


前言

C++11引入了许多新的语言特性和标准库扩展,这些变化使得C++编程更加强大和便捷。其中,列表初始化和委派构造函数是C++11中引入的两个重要特性。本文将深入探讨列表初始化和委派构造函数的概念、用法以及示例代码,帮助读者更好地理解和应用这些特性。


一、列表初始化 (List Initialization)

列表初始化是C++11引入的一种新的初始化语法,它通过使用花括号{}来初始化对象,可以应用于多种类型的初始化,包括数组初始化、结构体初始化、容器初始化等。同样,它还可以用于单一对象的初始化。

1.1数组初始化

在C++11之前,要初始化数组,我们可以使用传统的初始化方式,例如:

int arr[3] = {1, 2, 3};

在C++11中,我们可以使用列表初始化的方式来实现相同的功能:

int arr[3] {1, 2, 3};

1.2结构体初始化

在C++11之前,结构体的初始化需要使用构造函数或者成员变量的逐个赋值方式。而在C++11中,我们可以使用列表初始化来完成结构体的初始化,例如:

struct Point {
  int x;
  int y;
};

Point p = {1, 2};

通过列表初始化,我们可以更简洁地初始化结构体,并且不再需要自定义构造函数。

1.3容器初始化

在C++11之前,初始化容器需要手动添加元素,例如:

std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

在C++11中,我们可以使用列表初始化的方式来初始化容器,例如:

std::vector<int> vec = {1, 2, 3};

1.4列表初始化的优势

通过列表初始化,我们可以更直观地初始化容器,并且在一行代码中完成所有元素的添加。

总之,列表初始化提供了一种简洁、直观的初始化方式,不仅减少了代码量,还提高了代码的可读性和可维护性。

二、委派构造函数 (Delegating Constructors)

2.1委派构造函数是什么?

委派构造函数是C++11引入的另一个重要特性,它允许在一个构造函数中通过调用其他构造函数来初始化对象,从而避免了代码的冗余和重复。

在理解委派构造函数之前,我们可以使用一个生动的比喻来解释它的概念:假设你有一个房子需要建造,但你没有时间从头开始建造,于是你雇佣了一个建筑工人来帮助你。这个建筑工人会为你提供一个全套建造房屋所需的材料和步骤,而你只需要按照他的指引进行即可。这里,你充当的角色就是"委派者",而建筑工人则是"被委派者",通过委派,你可以快速建造房子,而不需要亲自处理每个细节。

在C++中,委派构造函数的概念与上述比喻相似。通过委派构造函数,我们可以在一个构造函数中调用其他构造函数来初始化对象,从而避免了重复的初始化逻辑。具体来说,当一个构造函数使用冒号(:)后面的初始化列表调用其他构造函数时,我们称之为委派构造函数。

2.2委派构造函数示例代码

下面是一个示例代码,演示了委派构造函数的使用:

class Rectangle {
private:
  int width;
  int height;

public:
  Rectangle() : Rectangle(0, 0) {
    // 委派给指定宽高的构造函数
  }

  Rectangle(int side) : Rectangle(side, side) {
    // 委派给指定宽高的构造函数
  }

  Rectangle(int width, int height) : width(width), height(height) {
    // 构造函数的实际逻辑
  }
};

2.3调用顺序

调用无参数的调用顺序:
在这里插入图片描述

调用1个参数的调用顺序:
在这里插入图片描述

调用2个参数的调用顺序:和我们正常的顺序是一样的

2.3委派构造函数优势

在上述示例中,我们定义了一个Rectangle(矩形)类,它具有三个构造函数:默认构造函数、边长相同的构造函数和指定宽高的构造函数。在默认构造函数和边长相同的构造函数中,我们使用委派构造函数的方式,将初始化逻辑委派给指定宽高的构造函数。这样,我们可以避免在多个构造函数中重复编写相同的初始化逻辑。


总结

在上述示例中,我们定义了一个Rectangle(矩形)类,它具有三个构造函数:默认构造函数、边长相同的构造函数和指定宽高的构造函数。在默认构造函数和边长相同的构造函数中,我们使用委派构造函数的方式,将初始化逻辑委派给指定宽高的构造函数。这样,我们可以避免在多个构造函数中重复编写相同的初始化逻辑。

总结:

在本文中,我们深入探讨了C++11中的两个重要特性:列表初始化和委派构造函数。通过列表初始化,我们可以更直观地、简洁地初始化数组、结构体和容器。而委派构造函数则允许我们在一个构造函数中通过调用其他构造函数来初始化对象,减少了代码重复和冗余。这些特性不仅使得代码更加简洁和可维护,还为我们提供了更高效的编程方式。

C++11在语言层面上引入了许多新特性和改进,使得C++编程更加强大和便捷。掌握列表初始化和委派构造函数这两个特性,将为我们带来更高效、更简洁的代码实现。随着对这些特性的深入理解和应用,我们能够编写出更具可读性、可维护性的C++代码,提高开发效率和代码质量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter产物以aar形式嵌入android原生工程

以前做的项目中&#xff0c;flutter都是作为module嵌入原生工程中&#xff0c;新公司项目却是以aar形式嵌入android工程&#xff0c;这种优点是原生工程不必配置flutter环境也能跑了&#xff0c;这里记录一下简单步骤。 创建一个flutter module 通过android studio创建一个fl…

verdi dump状态机的波形时直接显示状态名

前段时间看到别人用verdi看状态机的波形时&#xff0c;可以显示定义的状态参数&#xff0c;觉得很有意思&#xff0c;特地学习了一下 通常拉出状态机信号的波形是下面这样的 这种信号&#xff0c;我们要想知道每个数值代表的状态&#xff0c;还需要跟定义的parameter比对 像这…

LeetCode(力扣)763. 划分字母区间Python

LeetCode763. 划分字母区间 题目链接代码 题目链接 https://leetcode.cn/problems/partition-labels/description/ 代码 class Solution:def partitionLabels(self, s: str) -> List[int]:last_occ {}for i, ch in enumerate(s):last_occ[ch] iresult []start 0end …

PolyAI:对话式AI代替传统客服

【产品介绍】 名称 PolyAI 具体描述 PolyAI 是一家总部位于伦敦的人工智能初创公司&#xff0c;致力于开发对话式人工智能的机器学**台&#xff0c; 在 B 轮融资中筹集了 4000 万美元&#xff0c;用于部署对话式人工智能代理并颠覆传统的客户…

下载安装nvm教程(附带下载切换node.js版本实操)

目录 一、介绍 二、下载 三、安装步骤 四、配置淘宝源 五、测试 六、常用的nvm命令 七、下载切换node版本实操 node版本参考 一、介绍 node版本管理&#xff1a;nvm就是可以切换你的node版本&#xff0c;特别是当node版本过高或者过低时候&#xff0c;就可以用nvm进行…

鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决

目录 问题解决思路解决代码&#xff08;标注【主要代码】的为重点&#xff09; 问题 拖动该悬浮球时&#xff0c;鼠标弹起可能会触发悬浮球内事件 解决思路 鼠标拖动盒子时&#xff0c;将 isMove 设为 true 意为正在拖动盒子&#xff0c;此时将 class"btns_move" 遮…

音乐项目后台管理系统出现的问题

1.当对歌手的歌曲进行编辑时候&#xff0c;会把所有的歌曲信息给修改了。 解决方法:修改controller层的中SongController代码中的这一行代码 boolean flag songService.updateById(song); 2.添加歌曲&#xff0c;在弹出框中输入&#xff0c;没有显示。原因&#xff1a;前端页…

HTML显示中文空格字符,emsp;一个中文字符,ensp;半个中文字符

&emsp;一个中文字符 &ensp;半个中文字符 <ul><li class"li">姓&emsp;&emsp;名&#xff1a;<input type"text" /></li><li class"li">手&ensp;机&ensp;号&#xff1a;<input type"…

SCRUM产品负责人(CSPO)认证培训课程

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。产品负责人是Scrum的三个角色之一&#xff0c;产品负责人在Scrum产品开发当中扮演舵手的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答…

学信息系统项目管理师第4版系列07_项目管理知识体系

1. 项目管理原则 1.1. 勤勉、尊重和关心他人 1.1.1. 关键点 1.1.1.1. 关注组织内部和外部的职责 1.1.1.2. 坚持诚信、关心、可信、合规原则 1.1.1.3. 秉持整体观 1.1.2. 职责 1.1.2.1. 诚信 1.1.2.2. 关心 1.1.2.3. 可信 1.1.2.4. 合规 1.2. 营造协作的项目管理团队…

2019版本idea启动tomcat8.5版本控制台中文乱码

目录 一&#xff0c;检查tomcat安装 二&#xff0c;检查idea配置 前言: 最近使用idea去启动tomcat8.5版本时&#xff0c;控制台语句出现了乱码情况&#xff0c;最终解决了。 情况如下&#xff1a; 一&#xff0c;检查tomcat安装 第一步&#xff1a;检查安装的tomcat找到tomca…

#循循渐进学51单片机#如何学习单片机#not.1

1、了解普通发光二极管的参数&#xff0c;掌握限流电阻的计算方法。 1&#xff09; LED小灯靠电流点亮&#xff0c;电压1.8v~2.2v&#xff0c;电流是1~20ma&#xff0c;在1~5ma亮度有所变化&#xff0c;5MA以上亮度不变。 2&#xff09; 限流电阻的算法一般采用欧姆定律计算。…

C#生产管理进销存系统asp.net+sqlserver

管理员功能&#xff1a; 1&#xff09;系统用户管理 包括管理员的添加、删除和管理员密码修改。 2&#xff09;员工信息管理 包括员工信息、员工工资的添加、查询、修改和删除。 3&#xff09;客户信息管理 包括客户信息的添加、查询、修改和删除&#xff0c;以及客户生日提醒。…

IDM(Internet Download Manager)下载器2024最新版本如何下载?

IDM&#xff08;Internet Download Manager&#xff09;下载器能够兼容支持多种浏览器进行文件下载&#xff0c;很多时候只要复制一个地址IDM的下载弹窗就自动弹出来&#xff0c;有时候不需要下载的时候也会弹&#xff0c;时间久了就会感觉很烦&#xff0c;不过这个问题其实可以…

C#,数值计算——Hashfn1的计算方法与源程序

1 文本格式 using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Hashfn1 { private Ranhash hasher { get; set; } new Ranhash(); private int n { get; set; } public Hash…

【校招VIP】java语言考点之并发相关

考点介绍&#xff1a; 并发在操作系统中是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机上运行&#xff0c;但任一个时刻点上只有一个程序在处理机上运行。并发相关问题在校招面试中出现频次很高。 java语言考点之并发相…

AOSP源码中Android.mk文件中的反斜杠符号(\)的作用和使用

简介 在AOSP&#xff08;Android Open Source Project&#xff09;源码中的Android.mk文件中&#xff0c;反斜杠符号&#xff08;\&#xff09;的主要作用是将一行代码拆分成多行&#xff0c;以提高可读性并帮助组织较长的代码块。这对于定义复杂的构建规则和变量时特别有用。…

笔记1.3 数据交换

如何实现数据通过网络核心从源主机到达目的主机&#xff1f; 数据交换 交换网络&#xff1a; 动态转接动态分配传输资源 数据交换类型&#xff1a; &#xff08;1&#xff09;电路交换 &#xff08;2&#xff09;报文交换 &#xff08;3&#xff09;分组交换 电路交换的特…

长胜证券:怎么跟随主力进出?

跟着现在商场的快速改变和信息的普及化&#xff0c;人们在出资时越来越需求愈加精确的辅导和剖析。尤其是在股票商场&#xff0c;很多人想知道怎么跟从主力进出以获取更高的收益。在这篇文章中&#xff0c;咱们将从多个视点来评论这个论题。 一、了解主力资金的进出方向 首先&…

C语言-学生管理系统(结构体+数组实现)

1. 学生管理系统功能介绍 前面文章里介绍了结构体类型&#xff0c;知道结构体类型里可以存放不同的数据类型&#xff0c;属于一个有序的集合。 这篇文章就使用结构体知识点完成一个小练习&#xff0c;使用结构体数组设计一个简单的学生管理系统&#xff0c;作为结构体知识点的…