C++11(列表初始化,声明,范围for)

news2024/11/25 23:45:03

目录

一、列表初始化

1、一般的列表初始化

 2、容器的列表初始化

二、声明

1、 auto

2、decltype

3、nullptr

 三、 范围for


一、列表初始化

1、一般的列表初始化

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

int main()
{
    int array1[] = { 1, 2, 3, 4, 5 };
    int array2[5] = { 0 };

    return 0;
}

而在C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。

注:new 表达式初始化时一定不能写等号。

int main()
{
    int x1 = 1;
    int x2{ 2 };
    int array1[]{ 1, 2, 3, 4, 5 };
    int array2[5]{ 0 };
    int* pa = new int[4]{ 0 };

    return 0;
}

创建对象时也可以使用列表初始化方式调用构造函数初始化。如下图的d2和d3。

class Date
{
public:
    Date(int year, int month, int day)
        :_year(year)
        ,_month(month)
        ,_day(day)
    {
        cout << "Date(int year, int month, int day)" << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Date d2{ 2022, 1, 2 };
    Date d3 = { 2022, 1, 3 };
    return 0;
}

 2、容器的列表初始化

在 vector 和 list 这样的容器中,如果我们需要插入数据的话,我们就要通过 push_back 这样的函数去一个一个插入。但是,在c++11中,我们可以通过如下方式去插入数据:(等号也可以省略)。

vector<int> v1 = { 1,2,3,4 };

list<int> lt1 = { 1,2,3,4,5,6,7 };

这种插入的方式就非常方便,那么这种方式是怎么实现的呢?实现这种方式,就需要一个新的容器 了,这个容器叫 initializer_list。

它是C++11新增的容器,提供了 begin 和 end 函数,用于迭代器遍历;以及获取容器中的元素个数的 size 函数。

C++在语法层面会把 { } 认成 initializer_list,下面我们来看一看{ }的类型是什么:

auto x = { 1,2,3,4,5,6 };
cout << typeid(x).name() << endl;

从上图中我们发现该变量的类型就是 initializer_list 。

那么我们再来看一看vector的构造:

上面的(3)就是实现了 initializer_list ,这样就使得我们可以像上面那样对容器进行构造。

当用列表对容器进行初始化时,会被认为是initializer_list类型,此时不管有多少个值都能够被初始化vector,而以前我们必须使用 push_back 一个一个将元素插入。

所以现在有了C++11列表初始化的功能,我们也可以给我们自己之前模拟实现的vector和list容器加上这个功能,下面我就来给vector加上这个功能。

实现思路:遍历initializer_list 中的元素,然后push_back进要初始化的容器当中。

vector(initializer_list<T> il)
	:_start(nullptr)
	, _finish(nullptr)
	, _endofstorage(nullptr)
{
	typename initializer_list<T>::iterator it = il.begin();
	while (it != il.end())
	{
		push_back(*it);
		++it;
	}
}

二、声明

1、 auto

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

我们直接来使用一下它: 

int main()
{
    int i = 10;
    auto p = i;
    cout << "i: " << typeid(i).name() << endl;
    cout << "p: " << typeid(p).name() << endl;

    map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
    //map<string, string>::iterator it = dict.begin();
    auto it = dict.begin();
    cout << "it: " << typeid(it).name() << endl;
    return 0;
}

2、decltype

关键字decltype将变量的类型声明为表达式指定的类型,即:根据表达式的实际类型推演出定义变量时所用的类型。

上面我们用到的 typeid 也能够推导出变量的类型,那么它们有什么区别呢?

typeid拿到的只是类型的字符串,不能用这个再去定义对象。下面的定义方式就不正确。

typeid(x).name() y = 20    //这样定义y不行

 decltype 则可以推导出一个变量的类型,然后再去定义新的变量。如下图:

int x1 = 10;
decltype(x1) y1 = 20; //可以这样去定义y1

3、nullptr

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

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

 三、 范围for

int main()
{
    string s("hello world");
    string::iterator it = s.begin();
    while (it != s.end())
    {
	    cout << *it << " ";
	    it++;
    }
    cout << endl;

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
}

 上面两种遍历方式的结果完全相同。这是因为范围for本质上是迭代器,在代码编译的时候,编译器会自动将范围for替换为迭代器的形式去遍历。

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

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

相关文章

CAS( 比较并交换-乐观锁机制-锁自旋 )

1 概念及特性 CAS&#xff08;Compare And Swap/Set&#xff09;比较并交换&#xff0c;CAS 算法的过程是这样&#xff1a;它包含 3 个参数 CAS(V,E,N)。V 表示要更新的变量(内存值)&#xff0c;E 表示预期值(旧的)&#xff0c;N 表示新值。当且仅当 V 值等于 E 值时&#xff0…

二叉树题目:平衡二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;平衡二叉树 出处&#xff1a;110. 平衡二叉树 难度 4 级 题目描述 要求 给定一个二叉树&#xff0c;判断它是否…

生产者、消费者问题

线程六个状态&#xff1a; public enum State {/*** 新生*/NEW,/*** 运行*/RUNNABLE,/***阻塞*/BLOCKED,/*** 等待*/WAITING,/*** 超时等待*/TIMED_WAITING,/**死亡**/TERMINATED;} synchronized和lock的区别 1、synchronized是关键字&#xff0c;lock是类 2、synchronized全自…

蓝桥等考Python组别九级008

第一部分&#xff1a;选择题 1、Python L9 &#xff08;15分&#xff09; 运行下面程序&#xff0c;可以输出几行“*”&#xff1f;&#xff08; &#xff09; for i in range(8): for j in range(9): print(*, end ) print() 78910 正确答案&#xff1a;B 2、Python…

MySQL数据查询性能如何分析--Explain介绍说明

1、Explain是什么 Explain是MySQL执行查看执行计划命令的指令&#xff0c;使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 2、Explain官网介绍 http://dev.mysql.com/doc/refma…

MD5 绕过第三式:ffifdyop

文章目录 参考环境推荐阅读雾现两个 PHP 文件表结构分析 雾散ASCII 编码二进制数据到 ASCII 文本的转化绕过原理ffifdyop绕过 ffifdyop 的批量化生产批量化生产注意事项细节一字之差运算符优先级 实际需要遵守的规则 生产机器 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心…

中国逐年干燥度指数数据集

简介&#xff1a; 中国逐年干燥度指数&#xff0c;空间分辨率为1km&#xff0c;时间为1901-2022&#xff0c;为比值&#xff0c;没有单位。该数据集是基于中国1km逐月潜在蒸散发&#xff08;PET&#xff09;和降水量&#xff08;PRE&#xff09;采用比值法计算式得到&#xff…

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

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// High-quality random hash of an integer into several numeric types. /// </summary> public class Ranhash { public Ranhash() { }…

Qt扩展-QCustomPlot 用户交互

QCustomPlot 用户交互 一、概述二、操作范围三、选择机制1. 控制Graph的可选择性和选择状态2. 所选对象的外观3. 多部分对象4. 对选择变化做出反应 四、用户交互信号 一、概述 QCustomPlot提供了多个内置的用户交互。它们大致可以分为 通过用鼠标拖动和滚动鼠标滚轮进行范围操…

Vue控制textarea可输入行数限制-案例

控制只能输入六行内容 UI部分代码 //我使用了antd ui库 <a-form-model-item ref"address_group" label"规则描述" prop"address_group" > <a-textarea:rows"6"style"width: 60%"placeholder"一次最多输入6行…

BUUCTF reverse wp 71 - 75

[NPUCTF2020]你好sao啊 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rax__int64 v4; // rdx__int64 v5; // raxsize_t v6; // rax__int64 v7; // rax__int64 v8; // rdx__int64 v9; // rax__int64 v11; // rdx__int64 v12; // raxchar …

AOP:分页参数统一校验

需求说明 为了保证系统的安全性&#xff0c;需要对所有的 查询列表 接口&#xff0c;添加分页参数&#xff0c;并对分页参数进行校验&#xff0c; &#xff0c;保证参数的合法性。 比如&#xff0c; pageSize&#xff08;每页显示条数&#xff09;&#xff0c;如果不做校验&a…

基于Java的个人博客文章管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

传统安防音视频平台架构

内部级联,为上下级均为自己平台海康子进程调用海康的设备SDKPTPCS通过封装代理不同的私有协议的差异,封装为大华统一的三代协议PC客户端通过调用平台SDKCMS一般采用双机热备技术PTPCS系统一般采用Windows嵌入式,由于部分设备厂家提供的SDK只有Windows的服务和服务之间的调用通过…

爱创科技携手源石酒庄,助力酒企走出窜货售假“沼泽”

在中国&#xff0c;一场关于美酒生活的消费革命正默默兴起。随着人们生活品质的不断提升&#xff0c;越来越多的消费者开始追求个性化、健康和美好的饮酒体验&#xff0c;消费升级正推动着酒行业整体逐步“迭代进化”。作为国内最早开始葡萄酒产业工业化发展的地区之一&#xf…

BUUCTF reverse wp 56 - 60

[ACTF新生赛2020]SoulLike __int64 __fastcall main(int a1, char **a2, char **a3) {char v5; // [rsp7h] [rbp-B9h]int i; // [rsp8h] [rbp-B8h]int j; // [rspCh] [rbp-B4h]int flag_content[14]; // [rsp10h] [rbp-B0h] BYREFchar flag[110]; // [rsp4Ah] [rbp-76h] BYREFu…

网络协议--概述

1.2 分层 网络协议通常分不同层次进行开发&#xff0c;每一层分别负责不同的通信功能。一个协议族&#xff0c;比如TCP/IP&#xff0c;是一组不同层次上的多个协议的组合。 TCP/IP通常被认为是一个四层协议系统&#xff0c;如图1-1所示。每一层负责不同的功能&#xff1a; 1.链…

从零手搓一个【消息队列】实现消息在文件中的存储

文章目录 一、序列化 / 反序列化二、文件存储设计1, 队列目录2, 消息数据文件3, 消息统计文件 三、硬盘管理 -- 文件1, 创建 MessageFileManager 类2, createQueueFiles() 创建目录/文件3, deleteFiles() 删除目录/文件4, checkFileExists() 检查目录/文件是否存在5, readStat(…

MonkeyRunner自动化测试

一&#xff1a;简介 MonkeyRunner提供了一个API&#xff0c;使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner&#xff0c;您可以写出一个Python程序去安装一个Android应用程序或测试包&#xff0c;运行它&#xff0c;向它发送模拟击键&…

单目标应用:基于狐猴优化算法(Lemurs Optimizer,LO)的微电网优化调度MATLAB

一、狐猴优化算法 狐猴优化算法&#xff08;Lemurs Optimizer&#xff0c;LO&#xff09;由Ammar Kamal Abasi等人于2022年提出&#xff0c;该算法模拟狐猴的跳跃和跳舞行为&#xff0c;具有结构简单&#xff0c;思路新颖&#xff0c;搜索速度快等优势。 狐猴头体长约为30-45…