C++11语法(基础)【一】

目录

1. C++11简介

2. 统一的列表初始化

2.1 {}初始化

2.2 std::initializer_list

3. 声明

3.1 auto

3.2 decltype

3.3 nullptr


声明:C++11我会分几篇来讲,每一篇我都会讲几种特性。

1. C++11简介

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。 从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于 C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言相比较而言, C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更加强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个 重点去学习。C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程 主要讲解实际中比较实用的语法。

以下链接为C++11的文档,大家若有需要或则感兴趣可以看看文档

https://en.cppreference.com/w/cpp/11

小故事:

1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫 C++ 07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。

2. 统一的列表初始化

2.1 {}初始化

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

struct Point
{int _x;int _y;
};int main()
{int array1[] = { 1,2,3,4,5 };int array2[5] = { 0 };Point p = { 1,2 };return 0;
}

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

struct Point
{int _x;int _y;
};
int x = 1;
int y{ 2 };
int array1[]{ 1,2,3,4,5 };
int array2[5]{ 0 };
Point p{ 1,2 };
// C++11中列表初始化也可以适用于new表达式中
int* p2 = new int[4] {0};

创建对象时也可以使用列表初始化方式调用构造函数初始化

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 d1(2024, 10, 1);// old style// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2024,10,2 };Date d3 = { 2024,10,3 };return 0;
}

运行截图:

我们确实可以从结果看到C++11支持的列表初始化会调用构造函数初始化。

2.2 std::initializer_list

std::initializer_list的介绍文档:

http://www.cplusplus.com/reference/initializer_list/initializer_list/

std::initializer_list是什么类型:

int main()
{// the type of il is an initializer_listauto il = { 10,20,30 };cout << typeid(il).name() << endl;return 0;
}

运行截图:

std::initializer_list使用场景:

std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加 std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。比如:

http://www.cplusplus.com/reference/list/list/list/

http://www.cplusplus.com/reference/vector/vector/vector/

http://www.cplusplus.com/reference/map/map/map/

http://www.cplusplus.com/reference/vector/vector/operator=/

以上链接分别是list容器的构造函数,vector容器的构造函数,map的构造函数以及vector的赋值运算符重载的文档。

示例代码:

int main()
{vector<int> v = { 1,2,3,4 };list<int> l = { 1,2,3 };// 这里{"苹果", "apple"}会先初始化构造一个pair对象map<string, string> m = { {"苹果","apple"},{"香蕉","banana"} };// 使用大括号对容器赋值v = { 10, 20, 30 };return 0;
}

模拟实现的vector也支持{}初始化和赋值

namespace kuruomi
{template<class T>class vector {public:typedef T* iterator;vector(initializer_list<T> l){_start = new T[l.size()];_finish = _start + l.size();_endofstorage = _start + l.size();iterator vit = _start;//在模板编程中,当你需要在模板定义中引用依赖于模板参数的类型时,就必须使用 typename。//因为编译器无法确认此处的iterator是类型还是变量,不加的话编译器会报错。typename initializer_list<T>::iterator lit = l.begin();while (lit != l.end()){*vit++ = *lit++;}//for (auto e : l)//   *vit++ = e;}vector<T>& operator=(initializer_list<T> l) {vector<T> tmp(l);std::swap(_start, tmp._start);std::swap(_finish, tmp._finish);std::swap(_endofstorage, tmp._endofstorage);return *this;}private:iterator _start;iterator _finish;iterator _endofstorage;};
}int main()
{kuruomi::vector<int> v = { 1,2,3,4 };v = { 10, 20, 30 };return 0;
}

这三个成员变量分别是数组的开头、结尾、空间边界,这里我们就是利用initializer_list参数进行初始化,用迭代器的方式进行拷贝,赋值运算符重载就是复用了拷贝构造。

3. 声明

c++11提供了多种简化声明的方式,尤其是在使用模板时。

3.1 auto

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

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

运行截图:

3.2 decltype

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

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;
}

运行截图:

3.3 nullptr

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

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

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

相关文章

slam入门学习笔记

SLAM是Simultaneous localization and mapping缩写&#xff0c;意为“同步定位与建图”&#xff0c;主要用于解决机器人在未知环境运动时的定位与地图构建问题&#xff0c;目前广泛用于机器人定位导航领域&#xff0c;VR/AR方面&#xff0c;无人机领域&#xff0c;无人驾驶领域…

【小白请绕道】Redis 的 I/O 多路复用技术,它是如何工作的?

Redis 的 I/O 多路复用技术是其高性能的关键之一。在单个线程中&#xff0c;Redis 可以同时处理多个网络连接&#xff0c;这是通过使用 I/O 多路复用技术实现的。这种技术允许 Redis 在单个线程中监听多个套接字&#xff0c;并在套接字准备好执行操作时&#xff08;如读取或写入…

STM32F1,F4,L1系列禁止JTAG和SW引脚方法

STM32F1系列 程序中在使用到JTAG、SWD的某个IO 时&#xff0c;需要禁用掉相关调试方法后&#xff0c;再配置相应的IO方式。在需要相应的接口配置前使用这些代码。 对于F1系列&#xff0c;调用函数进行专门的禁止。 标准库配置方式&#xff1a; RCC_APB2PeriphClockCmd(RCC_A…

2024源代码加密软件TOP10分享|企业源代码加密软件

在现代企业的数字化转型过程中&#xff0c;源代码作为企业核心知识产权之一&#xff0c;至关重要。为了防止数据泄漏、外部攻击以及内部违规操作&#xff0c;企业越来越关注源代码的加密和保护。本文将为大家介绍2024年最受欢迎的十大源代码加密软件&#xff0c;帮助企业更好地…

助力新能源汽车行业的发展,尽在AUTO TECH 2025华南展

随着全球对环境保护的重视和石油资源的逐渐减少&#xff0c;新能源汽车的发展已经成为必然趋势。预计未来几年&#xff0c;新能源汽车的市场规模和销量将继续保持快速增长。根据 IDC 预测&#xff0c;中国乘用车市场中新能源车市场规模将在 2028 年超过 2300 万辆&#xff0c;年…

面试经典 150 题:力扣88. 合并两个有序数组

每周一道算法题启动 题目 【题目链接】 【解法一】合并后排序 排序后的数组自动省略0的数字&#xff0c;又学到了 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {//合并两个数组后排序for(int i0; i<…

基于springboot渔具销售系统设计与开发

文未可获取一份本项目的java源码和数据库参考。 选题背景及意义 随着社会的发展,渔具销售企业之间的竞争与合作变得越来越频繁.而销售部门作为企业的窗口,其地位无与伦比。在激烈的市场竞争中,企业要能对市场变化作出反应,销售部门起了关键作用,销售部门作为企业的生命已经成了…

什么味道呀!热播剧《凡人歌》启示:这几年,请主动给生活降级——早读(逆天打工人爬取热门微信文章解读)

试试就试试 引言Python 代码第一篇 洞见 热播剧《凡人歌》启示:这几年&#xff0c;请主动给生活降级第二篇 在错误的地方重复&#xff0c;毫无价值结尾 &#xff08;哈哈哈 真的吗&#xff1f;&#xff09; 引言 回复平静 啥啥都回复平静 家里人不要钱了 股票也跌停了 哈哈 怎…

搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

本文主要介绍如何使用Docker搭建EMQX MQTT服务器&#xff0c;并将其接入到Home Assistant中&#xff0c;最后演示如何使用.NET接入MQTT。 1. 背景 在智能家居系统中&#xff0c;MQTT&#xff08;消息队列遥测传输协议&#xff09;是一种轻量级的消息传输协议&#xff0c;特别适…

leetcode-10. 正则表达式匹配

题目描述 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s 的&#xff0c;而不是部分字符串。 示例 1&#xff1a; 输入&a…

稀土阻燃剂应用在PE(聚乙烯)上的优势

稀土阻燃协效剂基于稀土4f电子层结构带来的特有属性,在聚合物材料燃烧时可催化酯化成炭,迅速在高分子表面形成致密连续的碳层,隔绝聚合物材料内部的可燃性气体与氧气的接触,从而达到阻燃抑烟的效果,且燃烧时不产生有毒有害气体。其主要特点如下&#xff1a; 有效性&#xff1a;…

巡检系统新选择:零代码设备巡检系统的优势与功能

在现代工业生产中&#xff0c;设备的稳定运行是企业正常生产的关键。为了确保设备的可靠性和安全性&#xff0c;设备巡检系统成为了企业不可或缺的工具。而零代码设备巡检系统以其独特的优势&#xff0c;为企业的设备管理带来了全新的体验。 目前&#xff0c;市场上的巡检系统种…

OpenAI o1模型怎么使用,这篇文章告诉你

九月最大的热点无疑就是OpenAI推出o1模型 此次发布的o1 系列模型就是之前内部代码为“草莓”模型。 下面就给大家介绍一下此次o1模型的强大之处以及使用方法。 如果大家想要了解OpenAI o1方法&#xff0c;可直接拉到文章末尾。 1.、博士级学科能力 o1模型在推理能力上展现出…

[笔记]一组电缆、定位相关产品的技术参数

csdn不允许做广告&#xff0c;这里的那家定位供应商的技术看起来是可以的。很有希望。它的原理并不复杂&#xff0c;这家企业在处理业务领域以外的新型产品时&#xff0c;是查过资料的&#xff0c;这就超过了60%的同行。 1.电缆 仅给出现在市面供应的铠装电缆结构&#xff0c…

只用几行代码,不依赖任何框架?SMTFlow 轻松实现前端流程图

只用几行代码&#xff0c;不依赖任何框架&#xff1f;SMTFlow 轻松实现前端流程图&#xff01; 在前端开发中&#xff0c;如果你需要一个简单好用的流程图设计工具&#xff0c;SMTFlow 绝对是你的不二之选&#xff01;本文将介绍 SMTFlow 的核心功能、特点以及如何快速上手。 工…

RAG高级优化:检索策略探讨Fusion, HyDE安排上(含代码)

传统的检索方法通常依赖于对query进行语义理解(基于向量)或关键字匹配(BM25)&#xff0c;这两种方法都有其优点和缺点。融合检索、HyDE和RAG-Fusion可以创建一个更健壮和准确的检索系统。本文将介绍三种优化方法&#xff1a; Fusion retrieval&#xff1a; 基于向量和基于bm25的…

内核驱动开发之系统移植

系统移植 系统移植&#xff1a;定制linux操作系统 系统移植是驱动开发的前导&#xff0c;驱动开发是系统运行起来之后&#xff0c;在内核中新增一些子功能而已 系统移植就四个部分&#xff1a; 交叉编译环境搭建好bootloader的选择和移植&#xff1a;BootLoader有一些很成熟…

有关shell练习

统计家目录下.c文件的个数 #!/bin/bash count0for file in ~/* doif [[ "$file" *.c ]]; then((count))fidone echo "家目录下.c文件个数为:$count"定义一个稀疏数组(下标不连续)&#xff0c;写一个函数&#xff0c;求该稀疏数组的和&#xff0c;要求稀…

苹果、OPPO、小米的选择:聚焦TI AMOLED显示屏电源管理双子星芯片

如果说眼睛是心灵的窗户,那么显示屏就是计算机的窗户,通过这一扇窗,我们可以更直观的进行人机对话,更默契的与计算机配合。如今在各种产品的屏幕应用中,更多使用的是OLED显示屏,今天,平台君就给大家说说TI的两枚三路输出AMOLED显示器电源芯片——TPS65632和TPS65631W。 …

中高级工程师都需知道的七种高级 JavaScript 技术用例

直接干货走起&#xff1a; 1. 掌握闭包&#xff0c;让代码更简洁 闭包是 JavaScript 中最强大且经常被误解的功能之一。它们允许你使用私有变量创建函数&#xff0c;从而使你的代码更加模块化和更安全。 什么是闭包&#xff1f;当函数记住其词法范围时&#xff0c;即使函数…