【C++】C++11基础入门

目录

一、C++11发展史:

二、列表初始化:

1、初始化:

2、initializer_list函数:

三、声明:

1、auto自动识别类型:

2、decltype:

3、nullptr:

四、范围for:

五、STL中的变化:


一、C++11发展史:

  • C++98(1998年):在1998年,C++的第一个国际标准C++98正式发布,标志着C++的正式成熟和广泛应用,这是C++标准的第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会的认可,以模版的方式重写了C++标准库,引入了STL(标准模版库)。
  • C++03(2003年):这是C++标准的一个重大修订,主要增强了语言的稳定性和兼容性。C++03修复了一些C++98标准中的错误和漏洞。
  • C++11(2011年):C++11是一次革命性的更新,为C++引入了大量的新特性和功能。这些新特性包括智能指针、Lambda表达式、范围for循环、右值引用和移动语义、变长参数模板等。C++11使得C++在现代编程中更加灵活、高效和易于使用。
  • C++14(2014年):C++14是C++11的一个小幅度修订,主要关注于提升语言的可用性和一致性。C++14引入了一些新的语法特性和库扩展,如泛型lambda表达式,auto的返回类型推导等。
  • C++17(2017年):C++17进一步增强了C++的功能和表达能力。这次更新引入了if constexpr、结构化绑定、折叠表达式等语法特性,同时改进了标准库中的多个组件,如string、filesystem等。
  • C++20(2020年):C++20是C++历史上的又一个重要里程碑。这次更新引入了一系列新特性和改进,如协程(Coroutines)、概念(Concepts)、模块化(Modules)等。

ok,那么接下来对C++11里面的常用语法进行列举:

二、列表初始化:

1、初始化:

首先要知道,C++ 中的内置类型如int,double等都已经预先配备了构造函数,用于初始化这些类型的变量。

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

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和自定义的类型。

使用初始化列表时,可添加等号=,也可不添加。

int main()
{int arr1[] = { 1, 2, 3, 4, 5 };for (size_t i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++){cout << arr1[i] << " ";}cout << endl;int arr2[5] = { 0 };Point p = { 1, 2 };cout << p._x <<" "<<p._y << endl;cout << endl;return 0;
}

// 日期类
class Date
{
public:Date(int d, int m, int y):_day(d), _month(m), _year(y){}private:int _day;int _month;int _year;
};int main()
{int x1 = { 1 }; //可添加等号int x2{ 2 };    //可不添加等号//使用大括号对数组元素进行初始化int array1[]{ 1, 2, 3, 4, 5 }; //可不添加等号int array2[5]{ 0 };            //可不添加等号//使用大括号对结构体元素进行初始化,本质都是调用构造函数Point p1 = { 1, 2 }; //可不添加等号,多参数构造函数隐式类型转换Point p2{ 1, 2 }; //C++11中列表初始化也可以用于new表达式中//int* p3 = new int[4] = { 0 };//不可添加等号int* p3 = new int[4] {0};      int* p4 = new int[4] {1, 2, 3, 4}; //一般调用构造函数创建对象的方式Date d1(1, 2, 3);//C++11支持的列表初始化,这里也会调用构造函数初始化Date d2 = { 2,3,4 };Date d3{ 3,4,5 };return 0;
}

2、initializer_list函数:

这是C++11中新加的,在里面只实现了如下,构造,size,迭代器的功能。

这个是在C++11中的新增的构造函数重载,只要重载了initializer_list函数就能够进行列表初始化

有了这个构造函数就可以对容器进行列表初始化了:

v1这个实际上就是编译器先将{1,2,3,4,5,6,7,8,9}进行类型识别为initializer_list类型,然后再通过C++11新增的构造函数重载。

三、声明:

1、auto自动识别类型:

首先要知道typeid这个关键字,这是一个操作符,类似于sizeof。

运行时获知变量类型名称,typeid(变量).name()

但是这个获得的变量只能看不能用:

如下,只可以打印出来看看:

而auto的作用常常与那种要写特别长的类型,或者是范围for中(这里可就用typeid来打印出来看看)

注意:

1、auto的使用必须在右边要有赋值的,也就是在右边的变量要可知类型变量

2、auto不能直接定义变量。

2、decltype:

关键字decltype将变量的类型声明为表达式指定的类型

如下就是decltype的些许用法,与auto不同的是declype可以不用实例化,只是定义一个变量也可以。

template<class T1, class T2>
void F(T1 t1, T2 t2)
{decltype(t1*t2) ret;cout << typeid(ret).name() << endl;
}
int main()
{const int x = 1;double y = 2.2;decltype(x*y) ret; //ret的类型是doubledecltype(&x) p;//p的类型是int*cout << typeid(ret).name() << endl;cout << typeid(p).name() << endl;F(1, 'a');return 0;
}

decltype还可以进行模版传参,但是auto不可以

decltype可以推导出参数的类型并且进行传递。

vector<decltype(it)> v1;

3、nullptr:

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

void Func(int x)
{cout << "Func(int x)" << endl;
}void Func(int* p)
{cout << "Func(int* x)" << endl;
}int main()
{int* p = NULL; // int* p = 0;Func(NULL); // Func(0);Func(nullptr);return 0;
}

在如上所示代码中,用NULL传参调用Func函数,本来想的是会走下面的,但是因为C++中NULL被定义成字面量0,所以就会走上面的,所以C++就加了nullptr作为实实在在的空指针。

四、范围for:

这个是C++中的“语法糖”,在遍历的时候就很方便。

int main()
{cout << "遍历vector" << endl;vector<int> v = { 1,2,3,4,5 };for (auto e : v){cout << e << " ";}cout << endl;vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;cout << "遍历map" << endl;map<int, int> m = { {1,1},{2,2},make_pair(3,3) };for (auto e : m){cout << e.first << ":" << e.second << endl;}cout << endl;map<int, int>::iterator mit = m.begin();while (mit != m.end()){cout << (*mit).first << ":" << (*mit).second << endl;mit++;}return 0;
}

如上就是对容器进行遍历,范围for的底层实际上就是迭代器的实现的,只要容器支持迭代器就可以使用范围for,通过上述代码也可以看到,写范围for的遍历比写迭代器的遍历的代码量要少得多,所以在日常使用中也多推荐使用范围for。

注意:

范围for中获取的值,默认是不可被修改的,如果想要修改,需要使用引用类型获取值:

int main()
{vector<int> v = { 1,2,3,4,5 };cout << "当未加引用后进行e++操作并不会使数组进行改变" << endl;for (auto e : v){cout << e << " ";e++;}cout << endl;for (auto e : v){cout << e << " ";}cout << endl;cout << "当加引用后进行e++操作并会使数组进行改变" << endl;for (auto& e : v){cout << e << " ";e++;}cout << endl;for (auto e : v){cout << e << " ";}return 0;
}

五、STL中的变化:

如上,红框框中就是STL中新增的容器,unordered_map和unordered_set就是新增的比较不错的容器,并且在之前就已经模拟实现过了。

array这个对标的是静态数组

int main()
{int a1[10];array<int, 10> a2;cout << sizeof(a1) << endl;cout << sizeof(a2) << endl;cout << sizeof(array<int, 20>) << endl;return 0;
}

但是vector基本可以代替这个,并且vector里面还支持迭代器,扩容,插入删除等等。

所以array用的比较少。

forward_list这个是单链表

传统的list是一个双向链表,这个新加的是一个单向链表,只支持头插头删,不支持尾插尾删,因为单链表在进行尾插尾删时需要先找尾,时间复杂度为O(N)。

forward_list提供的插入函数叫做insert_after,也就是在指定元素的后面插入一个元素,这样的是因为比较方便不用找前一个元素,这样效率不会很低。

forward_list提供的删除函数叫做erase_after,也就是删除指定元素后面的一个元素,和insert_after差不多,如果删除前一个效率不行。

总的来说:

forward_list毕竟比list少个指针,所以这个其实就是时间换空间的,但是如今都不是很缺空间,在日常中用的比较少。

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

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

相关文章

vue3+vue-baidu-map-3x 实现地图定位

文档地址&#xff1a;一个是2一个是3 https://dafrok.github.io/vue-baidu-map/#/zh/index vue-baidu-map-3x 1.首先要到百度地图开放平台上建一个账号&#xff0c;如果有百度账号可以直接登录百度地图-百万开发者首选的地图服务商,提供专属的行业解决方案 2.点击控制台&am…

V2X介绍

文章目录 什么是V2XV2X的发展史早期的DSRC后起之秀C-V2XC-V2X 和DSRC 两者的对比 什么是V2X 所谓V2X&#xff0c;与流行的B2B、B2C如出一辙&#xff0c;意为vehicle to everything&#xff0c;即车对外界的信息交换。车联网通过整合全球定位系统&#xff08;GPS&#xff09;导…

C#使用log4net结合sqlite数据库记录日志

0 前言 为什么要把日志存到数据库里? 因为结构化的数据库存储的日志信息,可以写专门的软件读取历史日志信息,通过各种条件筛选,可操作性极大增强,有这方面需求的开发人员可以考虑。 为什么选择SQLite? 轻量级数据库,免安装,数据库的常用的基本功能都有,可以随程序…

如何打开/解包星露谷物语XNB文件(附软件资源)

一、什么是 XNB 文件&#xff1f; 游戏将数据、地图和纹理存储在 .xnb 这种压缩数据文件中&#xff0c;它们在游戏的 Content 文件夹中。例如&#xff0c;对话期间显示的阿比盖尔的头像来自这个文件&#xff1a; Content\Portraits\Abigail.xnb。解包这个文件&#xff0c;你会…

SIP 业务举例之 Call Forwarding - No Answer(无应答呼叫转移)

目录 1. Call Forwarding - No Answer 简介 2. RFC5359 的 Call Forwarding - No Answer 信令流程 呼转开始 呼转完成 3. Call Forwording - No Answer 过程总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 …

ISO21434 信息安全开发流程咨询合规内容和步骤

ISO 21434是汽车网络安全风险管理的一项国际标准&#xff0c;旨在帮助汽车制造商和供应商识别、评估和管理车辆整个生命周期中的网络安全风险。以下是ISO 21434咨询可能包含的内容以及实施咨询的方法论步骤&#xff1a; 咨询内容&#xff1a; 标准解读与培训&#xff1a;帮助…

【Unity】Unity中文本中插入超链接且可点击响应,TextMeshPro的进阶用法

一、需求和尝试 今天遇到这样一个需求&#xff1a;在文本中插入超链接&#xff0c;且这个链接可以点击跳转对应的url&#xff0c;具体形式如下图所示。 其实这个有一个简单粗暴的方法&#xff0c;就是把需要加超链接的文本单独拿出来&#xff0c;和其他文本进行拼接&#xf…

【数据结构与算法】之队列详解

队列&#xff08;Queue&#xff09;是一种重要的线性数据结构&#xff0c;遵循先进先出、后进后出的原则。本文将更详细地介绍队列的概念、特点、Java 实现以及应用场景。 模运算小复习&#xff1a; a % b 的值总是小于b 5 % 4 1 5 % 2 1 1 % 5 1 4 % 5 4 1. 队列…

windows|常见的文件伪装方法

几种常见的文件伪装方法&#xff1a; 扩展名伪装unicode字符伪装压缩包伪装隐写术 方法仅限于学习目的&#xff0c;不用于任何恶意或非法用途。 ———— 一、扩展名伪装&#xff1a;假装是另一种类型的文件 修改文件的扩展名&#xff0c;使得文件看起来像其他类型的文件&a…

取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题

标题 问题展示 修改后 <div class="loginForm"><el-formref="formB":model="formDataB":rules="rulesB"class="login-form"label-position="left"><el-form-item prop="userNo" clas…

CentOS 7(Linux)详细安装教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 一、CentOS镜像的下载&#xff08;准备工作&#xff09; 我选择的是其他镜像源的下载地址&#xff1a; Index of /centos-vault/7.6.1810/isos/x86_64/ | 南阳理工学院开源镜…

u盘装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

我们在u盘安装原版win10 iso镜像时&#xff0c;发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”&#xff0c;直接导致了无法继续安装下去。出现这种情况要怎么解决呢&#xff1f;下面小编分享u盘安装win10系统提示“windows无法安装到这个磁盘…

Android Gradle

#1024程序员节&#xff5c;征文# Gradle 是一款强大的自动化构建工具&#xff0c;广泛应用于 Android 应用开发。它通过灵活的配置和丰富的插件系统&#xff0c;为项目构建提供了极大的便利。本文只是简单的介绍 Gradle 在 Android 开发中的使用&#xff0c;包括其核心概念、构…

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台&#xff0c;求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才&#xff0c;求职者则通过上传简历寻找合适的工作。在这种复杂的场景中&#xff0c;我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

【分立元件】电阻的额定电压和最高电压

在文章:【分立元件】贴片电阻的额定功率中我们讲到使用电阻器时,不仅要注意额定功率,还要注意电压相关的一些项目。 本文我们将对与电阻基本参数关联的额定电压和元件最高电压这两个术语及其定义(包括它们之间的关系)进行解说。 额定电压 如下所示国巨片式电阻规…

ARM学习(33)英飞凌(infineon)PSOC 6 板子学习

笔者来聊一下psoc62 系列板子的知识 1、PSOC62板子介绍 Psoc6-evaluationkit-062S2 与RT-Thread联合推出的一款32位的双core的板子&#xff0c;基于CortexM4以及CortexM0。 管脚兼容Arduio。板载DAP-Link&#xff0c;可以支持调试以及串口&#xff0c;无需外接2MB的Flash以及…

Java 开发——(下篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

上篇速递 - Spring Boot 3 MybatisPlus 五、静态资源访问 1. 基础配置 在 Spring Boot 中访问静态资源非常方便。Spring Boot 默认支持从以下位置加载静态资源&#xff1a; /META-INF/resources//resources//static//public/ 这些目录下的文件可以直接通过 URL 访问。 例…

【python实操】python小程序之参数化以及Assert(断言)

引言 python小程序之参数化以及Assert&#xff08;断言&#xff09; 文章目录 引言一、参数化2.1 题目2.2 代码2.3 代码解释 二、Assert&#xff08;断言&#xff09;2.1 概念2.1.1 Assert语句的基本语法&#xff1a;2.1.2 基本断言2.1.3 断言函数参数2.1.4 断言前后状态一致 2…

【计网】从零开始认识IP协议 --- 理解网段划分,NAT策略,私有IP和公网IP,认识公网

任何收获都不是偶然&#xff0c; 一点一滴的进步终会让未来的你焕然一新&#xff01; 从零开始认识IP协议 1 为什么要进行网段划分2 特殊IP地址与数量限制3 私有IP和公网IP4 彻底理解网段划分5 认识公网 1 为什么要进行网段划分 我们以一个例子来讲解为什么要进行网段划分&a…

Java【多线程】单例模式

目录 单例模式 饿汉模式 懒汉模式 懒汉模式-多线程版 单例模式 单例模式是一种设计模式 设计模式相当于棋谱 棋谱&#xff0c;大佬把一些对局整个推演过程&#xff0c;写出来 设计模式&#xff0c;是属于程序员的棋谱 单例模式&#xff08;单个实例/对象&#xff09;&…