【C++】C++11--- 列表初始化|关键字

news/2024/5/20 20:41:25

目录

前言

列表初始化

创建对象时的列表初始化

单参数隐式类型转换

多参数的隐式类型转换

new表达式中使用列表初始化

列表初始化适用于STL 容器

模板类initializer_list

关键字auto

关键字decltype

关键字nullptr


前言

C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟,相比于C++98,C++11带来了数量可观的变化,其中包含了约140个新特性,以及对C++98标准中约600个缺陷的修正,这使得C++11更像是从C++98中孕育出的一种新语言;相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更加强大,而且能提升程序员的开发效率;

官方文档:C++11 - cppreference.com

列表初始化

C++98中,标准允许使用花括号{}对数组元素或者结构体元素进行统一的列表初始值设定;

struct person
{const char* name;int age;
};
int main()
{int array1[] = { 1, 2, 3, 4, 5 };//整型数组未指定初始化内容,按照默认值0初始化数组未指定的内容int array2[3] = { 1 };person p = { "Linda", 23 };return 0;
}

监视窗口:

C++11扩大了{}(初始化列表)的使用范围,使其可用于所有的内置类型与自定义类型,使用初始化列表时,可以添加等号,也可以不添加;

struct person
{const char* name;int age;
};
int main()
{int array1[]{ 1, 2, 3, 4, 5 };//整型数组未指定初始化内容,按照默认值0初始化数组未指定的内容int array2[3]{ 1 };person p{ "Linda", 23 };return 0;
}

监视窗口:

创建对象时的列表初始化

class Date
{
public://构造函数Date(int year,int month,int day):_year(year),_month(month),_day(day){cout << "调用构造函数" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d2(2024, 6, 1);//c++ 98Date d1 = { 2024,5,1 };//c++ 11 (不推荐使用)return 0;
}

运行结果:

单参数隐式类型转换

class Date
{
public://单参数(缺省)的构造函数/*Date(int year=2000):_year(year){cout << "调用缺省单参数构造函数" << endl;}*///单参数(无参)的构造函数Date(int year):_year(year){cout << "调用单参数(无参)构造函数" << endl;}
private:int _year;
};
int main()
{Date d1(2000);//d1-->自定义类型//10-->整型d1 = 10;//类型转换 return 0;
}

结论:无参的单参数构造函数与缺省的单参数构造函数皆支持隐式类型转换;

多参数的隐式类型转换

class Date
{
public://Date(int year, int month, int day)//(不支持隐式类型转换)//Date(int year, int month, int day=1)//(不支持隐式类型转换)//Date(int year, int month=1, int day=1)//(支持隐式类型转换)Date(int year=1, int month = 1, int day = 1)//(支持隐式类型转换):_year(year), _month(month), _day(day){cout << "调用构造函数" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2022);//2022 1 1//2023-->int类型 d1-->Date类型d1 = 2023;//2023 1 1return 0;
}

结论:

  1. 多参数第一个参数无默认值,其余参数皆存在默认值支持隐式类型转换;
  2. 多参数所有参数都存在默认值支持隐式类型转换;
int main()
{//单参数string s1("abcdef");//直接调用构造函数string s2 = "abcdef";//隐式类型转换(单参数构造函数支持隐式类型转换) //首先用常量字符串构造一个const string类型的匿名对象,然后匿名对象拷贝构造s2;//最后编译器优化为直接构造//多参数//构造+拷贝构造-->编译器优化为直接构造Date d3 = { 2024,5,1};//本质:隐式类型转换(多参数构造函数支持隐式类型转换)return 0;
}

new表达式中使用列表初始化

class Date
{
public://全缺省的默认构造函数Date(int year=2024,int month=5,int day=1):_year(year),_month(month),_day(day){cout << "调用构造函数" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 3, 1);Date d2(2024, 4, 1);//自定义类型数组未指定初始化内容,按照自定义类型的默认构造函数初始化数组未指定的内容;Date* darr1 = new Date[3]{ d1,d2 };// c++ 98Date* darr2 = new Date[3]{ {2024, 3, 1},{2024, 4, 1},{2024, 5, 1} }; //c++ 11(推荐使用)return 0;
}

监视窗口:

列表初始化适用于STL 容器

C++98中,对于自定义类型并不支持如下写法

vector<int> v = {1,2,3,4,5};//注:容器v中的参数个数是可变的

但是C++11中可以支持容器v中的参数为任意多个,本质原因为C++11中为各个STL容器提供了参数类型为initializer_list的构造函数;

模板类initializer_list

auto il = { 1, 2, 3, 4, 5 , 6, 7, 8};
//{}初始化列表传递给auto且初始化列表的数据类型为int,则il对象的类型initializer_list<int>

常用接口

int main()
{auto il = { 1, 2, 3, 4, 5, 6, 7, 8 };cout << "size=" << il.size() << endl;initializer_list<int>::iterator lit = il.begin();while (lit != il.end()){cout << *lit << " ";++lit;}cout << endl;return 0;
}

运行结果:

initializer_list的底层结构为两个指针,一个指向常量数组的起始位置,另一个指向常量数组的结束位置的下一个位置,那么vector的构造函数参数类型为initializer_list,如何支持容器vector中的参数为任意多个?

template <class T>
class vector
{typedef T* iterator;typedef const T* const_iterator;
public://如何进行范围形式的初始化vector(initializer_list<T>& il){_start = new T[il.size()];_finish = _start + il.size();_endofstorage = _start + il.size();iterator vit = _start;//利用迭代器进行赋值typename initializer_list<T>::iterator lit = il.begin();while (lit != il.end()){*vit++ = *lit++;}}
private:iterator _start;iterator _finish;iterator _endofstorage;
};

关键字auto

C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto也就毫无价值;

C++11中废弃auto原来的用法,将其用于实现自动类型推断,如此便要求必须进行显示初始化让编译器将定义对象的类型设置为初始化值的类型;

map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };map<string, string>::iterator it1 = dict.begin();
//使用auto关键字避免手写特别长的迭代器类型
auto it2 = dict.begin();

注意:禁用auto做返回值的用法;

关键字decltype

auto使用时必须对auto声明的类型进行初始化,否则编译器不能推导出auto的实际类型;

  • 作用:decltype 关键字用于获取表达式的类型;
  • 用法:decltype(express) 用于获取表达式 express的类型,并将其作为变量的类型或者函数的返回类型;
  • 特点:decltype 不执行表达式,而是在编译期间分析表达式的类型

decltype 的多种应用场景

  • 获取变量类型:通过分析变量的初始化表达式,推导出变量的类型;
  • 获取表达式类型:根据表达式的类型,获取相应的类型信息;
int x = 5;
decltype(x) a = 10; // 推导 a 的类型为 intstd::vector<int> v = {1, 2, 3, 4, 5};
decltype(v.size()) size = v.size(); //推导size的类型为 std::vector<int>::size_type

关键字nullptr

由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能表示指针常量,又能表示整形常量;所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针;

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

欢迎大家批评指正,博主会持续输出优质内容,谢谢各位观众老爷观看,码字画图不易,希望大家给个一键三连支持~ 你的支持是我创作的不竭动力~


http://www.mrgr.cn/p/18848623

相关文章

【强训笔记】day16

NO.1 代码实现&#xff1a; class StringFormat { public:string formatString(string A, int n, vector<char> arg, int m) {string ret;int j0;for(int i0;i<n;i){if(A[i]%){if(i1<n&&A[i1]s){retarg[j];i;}else {retA[i];}}else {retA[i];}}while(j&l…

Golang:deepcopy深拷贝工具库

Golang:deepcopy深拷贝工具库 原创 吃个大西瓜 Coding Big Tree 2024-05-02 08:30 云南 听全文Deep copy things译文:事物的深度复制文档github https://github.com/mohae/deepcopy pkg.go https://pkg.go.dev/github.com/mohae/deepcopy安装 go get github.com/mohae/deepco…

SpringCloud微服务之Eureka、Ribbon、Nacos详解

SpringCloud微服务之Eureka、Ribbon、Nacos详解 1、认识微服务1.1、单体架构1.2、分布式架构1.3、微服务1.4、SpringCloud 2、服务拆分与远程调用2.1、服务拆分的原则2.2、服务拆分示例2.2、提供者与消费者 3、Eureka注册中心3.1、Eureka的结构和作用3.2、搭建eureka-server3.2…

Sealos急速部署生产用k8s集群

最近一段时间部署k8s全部使用sealos了&#xff0c;整体使用感觉良好&#xff0c;基本没有什么坑。推荐给大家。 使用 Sealos&#xff0c;可以安装一个不包含任何组件的裸 Kubernetes 集群。 最大的好处是提供 99 年证书&#xff0c;用到我跑路是足够了。不用像之前kubeadm安装…

小程序引入 Vant Weapp 极简教程

一切以 Vant Weapp 官方文档 为准 Vant Weapp 官方文档 - 快速入手 1. 安装nodejs 前往官网下载安装即可 nodejs官网 安装好后 在命令行&#xff08;winr&#xff0c;输入cmd&#xff09;输入 node -v若显示版本信息&#xff0c;即为安装成功 2. 在 小程序根目录 命令行/终端…

毕业设计:《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》

前言 《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》&#xff0c;这是我在本科阶段的毕业设计&#xff0c;通过引入 Prometheus 和 ELK 架构实现企业对指标与日志的全方位监控。并且基于云原生&#xff0c;使用容器化持续集成部署的开发方式&#xff0c;通过 Sprin…

95、动态规划-编辑距离

递归暴力解法 递归方法的基本思想是考虑最后一个字符的操作&#xff0c;然后根据这些操作递归处理子问题。 递归函数定义&#xff1a;定义一个递归函数 minDistance(i, j)&#xff0c;表示将 word1 的前 i 个字符转换成 word2 的前 j 个字符所需的最小操作数。 递归终止条件…

day1_slidingWindow

一、滑动窗口模板 // 注意&#xff1a;java 代码由 chatGPT&#x1f916; 根据我的 cpp 代码翻译&#xff0c;旨在帮助不同背景的读者理解算法逻辑。 // 本代码不保证正确性&#xff0c;仅供参考。如有疑惑&#xff0c;可以参照我写的 cpp 代码对比查看。import java.util.Has…

C++ 引用

引用函数的形参还有引用传参这一形式 引用:是一个变量的别名,它是某个已经存在的变量的另一个名字。 引用创建后,不可更改 因不可更改,所以必须初始化 必须初始化,所以不可为空(不能被修改) 语法:引用传参语法:函数三种传参模式对比

.Net MAUI 搭建Android 开发环境

一、 安装最新版本 VS 2022 安装时候选择上 .Net MAUI 跨平台开发 二、安装成功后,创建 .Net MAUI 应用 三、使用 VS 自带的 Android SDK 下载 ,Android镜像、编译工具、加速工具 四、使用Vs 自带的 Android Avd 创建虚拟机 五、使用 Android 手机真机调试

基于springboot实现医院药品管理系统项目【项目源码+论文说明】

基于springboot实现医院药品管理系统演示 摘要 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到提升&#xff0c;而读书就…

AI 绘画神器 Fooocus 本地部署指南:简介、硬件要求、部署步骤、界面介绍

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 随着人工智能技术的飞速发展&#xff0c;AI 绘画逐渐成为创意领域的新宠。Fooocus 作为一款免费开源的 AI 绘画工具&am…

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

测试项目实战——安享理财1(测试用例)

说明&#xff1a; 1.访问地址&#xff1a; 本项目实战使用的是传智播客的安享理财项目&#xff08;找了半天这个项目能免费用且能够满足测试实战需求&#xff09; 前台&#xff1a;http://121.43.169.97:8081/ 后台&#xff1a;http://121.43.169.97:8082/ &#xff08;点赞收藏…

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题 2024/5/3 9:33 缘起&#xff1a;因为工作需要&#xff0c;编译服务器上都会安装Ubuntu20.04。 但是因为WINDOWS强悍的生态系统&#xff0c;偶尔还是有必须要用WINDOWS的时候&#xff0c;于是也安装了WIN10。 双系…

什么是虚拟货币?

随着科技的进步&#xff0c;虚拟货币逐渐进入公众视野&#xff0c;其影响深远且复杂。本文将从专业角度分析虚拟货币的发展现状、未来趋势&#xff0c;以及面临的挑战&#xff0c;并尝试提出一些思考。 一、虚拟货币的定义与现状 虚拟货币是一种基于区块链技术的数字资产&…

欧洲杯/奥运会-云直播

欧洲杯/奥运会要来了&#xff0c;如何升级自己的网站让你的顾客都能观赏直播已提高用户量呢&#xff1f;&#xff01; 【功能完善、平滑兼容】 云直播支持 RTMP 推流、 HLS 源站等多种直播源接入方式&#xff0c;提供直播 SDK&#xff0c;支持多终端适配&#xff0c;上行码率…

【C++】详解STL容器之一的deque和适配器stack,queue

目录 deque的概述 deque空间的结构 deque的迭代器 deque的数据设计 deque的优缺点 适配器的概念 ​编辑 stack的概述 stack的模拟实现 queue的概述 queue的模拟实现 deque的概述 deque的设计参考了另外两大容器vector和list。可参考下面两篇文章 详解vector&#x…

【LLM 论文】Least-to-Most Prompting 让 LLM 实现复杂推理

论文&#xff1a;Least-to-Most Prompting Enables Complex Reasoning in Large Language Models ⭐⭐⭐ Google Research, ICLR 2023 论文速读 Chain-of-Thought&#xff08;CoT&#xff09; prompting 的方法通过结合 few-show prompt 的思路&#xff0c;让 LLM 能够挑战更具…