【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.hqwc.cn/news/681497.html

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

相关文章

520送男士内裤给男朋友好吗?五大男士内裤测评种草

相信有很多朋友都选在520这个特殊的日子里为心爱的人挑选一份特别的礼物吧&#xff01;如果送礼给男朋友或老公&#xff0c;一份实用的礼物肯定是最佳选择哦&#xff01;很多男性朋友每条内裤都穿很久&#xff0c;如果给男朋友挑选合适的男士内裤&#xff0c;也是一种关心体贴的…

北斗卫星与电动自行车:导航技术的融合带来的变革

北斗卫星与电动自行车&#xff1a;导航技术的融合带来的变革 在科技飞速发展的当下&#xff0c;不少高科技产品已经逐渐融入我们的日常生活中&#xff0c;极大地提升了我们的生活品质和工作效率。北斗卫星系统作为中国自主研发的全球卫星导航系统&#xff0c;它的应用已经远远…

AI智能分析视频监控行业的发展趋势和市场发展浅析

监控视频AI智能分析技术的现状呈现出蓬勃发展的态势&#xff0c;这一技术源于计算机视觉和人工智能的研究&#xff0c;旨在将图像与事件描述之间建立映射关系&#xff0c;使计算机能够从视频图像中分辨出目标信息。 在技术上&#xff0c;监控视频AI智能分析技术已经实现了对视…

SAPUI5基础知识1 - 概览,库,支持工具,自学教程

1. SAPUI5 概览 1.1 SAPUI5 SAPUI5是一种用于构建企业级Web应用程序的开发框架。它是由SAP开发的&#xff0c;基于HTML5、CSS3和JavaScript技术。 SAPUI5提供了一套丰富的UI控件和工具&#xff0c;使开发人员能够快速构建现代化、可扩展和可定制的应用程序。 它还提供了数据…

为什么ARM不直接生产CPU?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;虽然ARM作为一个提供微架构、软核…

JavaScript算法描述【排序与搜索】六大经典排序|搜索旋转排序数组|在排序数组中查找元素的第一个和最后一个位置、数组中的第K个|

&#x1f427;主页详情&#xff1a;Choice~的个人主页 文章目录 搜索旋转排序数组方法一 二分查询最大最小值思路详解代码方法二 二分查询中间数 在排序数组中查找元素的第一个和最后一个位置、数组中的第K个最大元素和颜色分类在排序数组中查找元素的第一个和最后一个位置方法…

VMware 虚拟机打开一段时间后卡死,VNX进程CPU占比高

一、问题描述 打开虚拟机后可以正常运行 运行几分钟后突然卡死 然后通过任务管理器可以观察到VMware Workstation VMX应用进程的CPU占比高&#xff0c;CPU也出现异常 关闭虚拟机重新开启&#xff0c;还是一样卡死 二、系统环境 系统: Windows10 VMware: Workstation 17 Pro …

Java设计模式 _行为型模式_责任链模式

一、责任链模式 1、责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型模式。该模式会为请求创建一个接收者对象的链。在这个责任链里&#xff0c;通常每个接收者都包含对另一个接收者的引用&#xff0c;如果一个对象不能处理该请求&…

又一个限时免费生成图片的AI平台

网址 https://jimeng.jianying.com/ai-tool/image/generate 抖音官方的文升图&#xff0c;用抖音登录就可以&#xff0c;每天送60积分&#xff0c;目前看文生图好像是限时免费。 随手试了一下&#xff0c;速度很快&#xff0c;质量也还可以&#xff0c;背靠大厂&#xff0c;…

出货300万片后,智舱界「小高通」浮出水面

‍作者 |张祥威 编辑 |德新 2024年北京车展&#xff0c;本土芯片公司开始截击外企供应商。 很长一段时间内&#xff0c;汽车行业智驾芯片看英伟达&#xff0c;座舱芯片看高通。英伟达Orin系列广受欢迎&#xff0c;高通8155席卷主流智能汽车&#xff0c;8295更是被视为最强配置…

AMEYA360代理:稳先微车规WSD7025AD双通道高边智能开关介绍

高边开关是一种保护电子电路在过电流异常时免受电击穿破坏的电子元器件&#xff0c;与传统常规的保险丝不同&#xff0c;它通过负载电流检测防止系统组件因电流过大而造成短路损坏&#xff0c;在不损坏或恶化的条件下确保负载电流始终可控&#xff0c;提高汽车电气系统的可靠性…

【SpringBoot整合系列】SpringBoot整合RabbitMQ-基本使用

目录 SpringtBoot整合RabbitMQ1.依赖2.配置RabbitMQ的7种模式1.简单模式&#xff08;Hello World&#xff09;应用场景代码示例 2.工作队列模式&#xff08;Work queues&#xff09;应用场景代码示例手动 ack代码示例 3.订阅模式&#xff08;Publish/Subscribe&#xff09;应用…