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

目录

前言

列表初始化

创建对象时的列表初始化

单参数隐式类型转换

多参数的隐式类型转换

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.mzph.cn/news/833940.shtml

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

相关文章

学习软考----数据库系统工程师20

数据库技术基础 主要内容如下&#xff1a; DBMS的功能和特点 课本上&#xff1a; 数据库系统的三级模式结构 数据模型 E-R图

AI讲师大模型培训老师叶梓:大模型应用的方向探讨

大模型应用的关键方向及其落地案例可以从多个角度进行探讨&#xff0c;结合最新的研究和实际应用案例&#xff0c;我们可以更全面地理解这些技术如何推动社会和经济的发展。 Agent&#xff08;数字代理&#xff09;: 方向说明:Agent方向的AI技术旨在创建能够独立执行任务、做出…

Git系列:Git Stash临时保存与恢复工作进度

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

掌控网络流量,优化网络性能 - AnaTraf网络流量分析仪登场

在当今日新月异的网络环境中,网络流量监控和性能诊断已成为企业IT部门不可或缺的重要工作。只有充分了解网络流量状况,才能有效优化网络性能,提高业务运营效率。针对这一需求,全新推出的AnaTraf网络流量分析仪应运而生,为企业提供全面的网络监控和性能诊断解决方案。 快速定位…

嵌入式Linux的QT项目CMake工程模板分享及使用指南

在嵌入式linux开发板上跑QT应用&#xff0c;不同于PC上的开发过程。最大的区别就是需要交叉编译&#xff0c;才能在板子上运行。 这里总结下嵌入式linux环境下使用CMake&#xff0c;嵌入式QT的CMake工程模板配置及如何使用&#xff0c;分享给有需要的小伙伴&#xff0c;有用到的…

在做题中学习(50):搜索插入位置

35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;题目是有序的&#xff0c;时间复杂度O(logN),二分没跑了&#xff0c;题目说如果找不到target&#xff0c;返回它应该被插入位置的下标&#xff0c;所以可以分析一下示例2&…

后教培时代的新东方,正在找寻更大的教育驱动力?

近段时间&#xff0c;K12教育主要上市公司的阶段性业绩皆已出炉。从具体数据来看&#xff0c;随着时间推移&#xff0c;教培机构的转型之路已愈走愈顺。 财报显示&#xff0c;2023年12月1日-2024年2月29日&#xff0c;好未来实现营收4.3亿美元&#xff0c;同比增长59.7%&#…

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版是一款强大的虚拟机软件&#xff0c;支持多操作系统&#xff0c;提供卓越的虚拟化技术&#xff0c;确保流畅稳定的运行。新增特色功能如共享打印、TouchID集成等&#xff0c;提供便捷高效的虚拟机体验。界面美观现代&…

认识大模型提示词

一、写作助理 &#x1f4a5;最常使用的 prompt&#xff0c;用于优化文本的语法、清晰度和简洁度&#xff0c;提高可读性。 输入&#xff1a;作为一名写作改进助理&#xff0c;你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性&#xff0c;同时分解长句&#xff…

Google Earth Engine谷歌地球引擎计算遥感影像在每个8天间隔内的多年平均值

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;求取多年时间中&#xff0c;遥感影像在每1个8天时间间隔内的多年平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;系列教学文章…

[机器学习-01]一文了解|机器学习简介、工具选择和Python包基础应用

目录 前言 正文 01-机器学习简介 &#xff08;1&#xff09;诞生过程 &#xff08;2&#xff09;人工智能、机器学习和深度学习之间的关系 &#xff08;3&#xff09;机器学习核心 02-机器学习工具 &#xff08;1&#xff09;Anaconda简介 &#xff08;2&#xff09;Jupyte…

【千帆平台】使用AppBuilder零代码创建应用,Excel表格数据转为Markdown格式文本

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用名称应用描述应用头像角色指令组件能力开场白推…

springcloud报错:Failed to start bean‘webServerStartStop‘

如果你正在使用nacos进行服务注册&#xff0c;然后报一下错误&#xff1a; 那就说明的nacos没有打开&#xff0c;所以找到你的下载nacos的文件夹 好了&#xff0c;错误完美解决~

Leetcode—387. 字符串中的第一个唯一字符【简单】

2024每日刷题&#xff08;127&#xff09; Leetcode—387. 字符串中的第一个唯一字符 实现代码 class Solution { public:int firstUniqChar(string s) {int count[26] {0};for(char c: s) {count[c - a];}for(int i 0; i < s.length(); i) {if(count[s[i] - a] 1) {re…

射频无源器件之耦合器

一. 耦合器的作用 在射频电路中,射频耦合器将一路微波功率按比例分成几路,用于检测或监测信号,如功率测量和波检测,还可改变信号的幅度、相位等特性,以满足不同的通信需求。根据输入与耦合端的功率差,常被分为5dB、6dB、10dB等耦合器。射频耦合器的类型主要包括定向耦合…

OSPF Stub区域

原理概述 OSPF 协议定义了多种区域&#xff08; Area &#xff09;类型&#xff0c;其中比较常见的有 Stub 区域和 Totally Stub 区域。区域的类型决定了在这个区域当中所存在的 LSA 的类型。 Stub 区域不允许 Type-4和 Type-5 LSA 进入&#xff0c;该区域会通过 Type-3 LSA…

BFS专题——FloodFill算法:200.岛屿数量

文章目录 题目描述算法原理代码实现CJava 题目描述 题目链接&#xff1a;200.岛屿数量 PS:注意题目中每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。也就是说斜角是不算了&#xff0c; 例如示例二&#xff0c;是三个岛屿。 算法原理 这道题目是 DFS&#xff0…

实战BACnet/IP标准通信网关在楼宇自动化中的应用

智慧楼宇建设实现不同设备间的互联互通是一项巨大挑战&#xff0c;尤其是在那些历史悠久的建筑中&#xff0c;新旧系统并存的情况尤为普遍。某大型商业综合体就面临着这样的困境&#xff1a;老旧的暖通空调系统采用Modbus RTU协议&#xff0c;而新部署的能源管理系统却要求BACn…

502页 | 2024年人工智能指数报告-英文版(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 【2024年人工智能指数报告】 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT解决方案&…

学习软考----数据库系统工程师22

关系运算 基本的关系代数运算 拓展的关系运算 除&#xff1a;需要S连接中属性为C和D的两个元组都与R连接一样&#xff0c;且在R连接中对应的另外的元素完全一致 总结