当前位置: 首页 > news >正文

【C++ 20进阶(2):初始化 Initializer

【C++ 20进阶(2):初始化 Initializer】

原文:https://blog.csdn.net/weixin_44259356/article/details/144377955

引言

本篇文章为系列文章将着重介绍C++20新特性,一是希望可以和大家交流分享,二是也便于自己巩固学习

历史系列:

【C++ 20进阶(1):模块导入 import】
【C++ 20进阶(2):属性 Attribute】

0,介绍

本次主要介绍C++变量相关一些初始化,重点为C++20新增初始方式,之前版本有的重要内容也会有介绍

1,initializer_list

主要用于变量的初始化参数数量不定的情况,用例如下:

import <initializer_list>;
using namespace std;
int sum(initializer_list<int> values)
{int sum{0};for (int value : values) {sum += value;}return sum;
}int a {sum({1})};
int b {sum({ 1,2,3,4,5 })}; // 任意数量都行

2,统一初始化{}

初始化方式有好几种, 这里主要介绍C++ 11之后常用方便的写法,如:

struct StructA
{int x;double y;char z{'Z'};
};class ClassB
{
public:ClassB(int&& x, double&& y, char&& z) // 右值引用,减少数据拷贝,后续系列会有介绍{mX = x;mY = y;mZ = z;}private:int mX;double mY;char mZ;
};StructA structA{1,1.2,'A'}; // 推荐写法
ClassB classB{1,1.2,'B'}; // 推荐写法 C++11之后与ClassB classB = (1,1.2,'B'); 等价

另外还可以防止类型收窄

void func(int i) {}int main()
{func(1.1); // 不会报错,但是会丢失精度func({1.1}); // 会直接报错,收缩转换失效return 0;
}

3,Designated Initializers【指定初始化】

上述StructA在C++20中还可以这么写:

StructA structA{.x = 1,.y = 1.2,
}; // 必须按照变量定义顺序初始化,可自定义想初始化的变量

那么这么做有什么好处呢?指定初始化可以指定需要初始的内容,像是变量z如果不需要额外初始化则可以直接不指定,此时变量z的值便为默认的‘Z’。另外可以防止重载决议错误:

struct StructA
{int x;double y;char z{'Z'};
};struct StructB
{int x;double y;
};void func(StructA a) {}
void func(StructB b) {}int main()
{func({.x = 1,.y = 1.2,}); // 错误,类型匹配失败,会报错func({.x = 1,.y = 1.2,.z = 'A',}); // 正确return 0;
}

4,for初始化器

上一章我们就用过if初始化器,现在在C++20下for也可这么来写:

 for (array arr{ 1, 2, 3, 4 }; int i : arr){ }
http://www.lryc.cn/news/501365.html

相关文章:

  • 【重生之我在B站学MySQL】
  • Python实现中国象棋
  • LBS 开发微课堂|通过openGL ES轻松实现建筑物渲染及动画
  • map1[item.id]和map1.get(item.id)的区别为何前者取出的是空,后者取出的是正确的值
  • window端sqlplus连接linux_oracle11g
  • Go支付中台方案:多平台兼容与多项目对接
  • MySQL触发器的使用详解
  • 关于NLP交互式系统的一些基础入门
  • 如何在HTML中修改光标的位置(全面版)
  • PHP8 动态属性被弃用兼容方案
  • WPF表格控件的列利用模块适配动态枚举类
  • 【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面
  • Scala的隐式转换
  • 从视频编码的进化历程看技术革新
  • ECharts柱状图-阶梯瀑布图,附视频讲解与代码下载
  • 如何让Google快速收录你的页面?
  • 比例负载分配L(P);动态调整服务率:LDS
  • C++ ——— 类的 6 个默认成员函数之 构造函数
  • win11 恢复任务栏copilot图标, 亲测有效
  • 计算机网络-IPSec VPN工作原理
  • Tomcat项目本地部署
  • 开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置
  • 虚幻引擎开发命名规则
  • 解释强化学习中的batch, epoch, episode有什么区别与联系,分别有什么作用
  • MVC基础——市场管理系统(一)
  • 使用docker-compose安装Milvus向量数据库及Attu可视化连接工具
  • PostgreSQL函数中使用now()或current_timestamp的异同
  • 开发类似的同款小程序系统制作流程
  • bsp是板级支持包
  • P1784 数独 C语言(普遍超时写法)