【C++11】入门基础

🔥 个人主页:大耳朵土土垚
🔥 所属专栏:C++从入门至进阶

这里将会不定期更新有关C/C++的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉

文章目录

  • 1. C++11简介
  • 2. 统一的列表初始化
    • 2.1{}初始化
    • 2.2 std::initializer_list
  • 3. 声明
    • 3.1 auto
    • 3.2 decltype
    • 3.3 nullptr
  • 4. 范围for循环
  • 5. 结语


1. C++11简介


  C++11是C++编程语言的一个重要版本,它于2011年发布。相比于C++98/03C++11给C++带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。C++11能更好地用于系统开发和库开发、语法更加泛化和简单化,更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。

  ✨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 main()
{//内置类型int x1 = 1;int x2{ 2 };	//不加 =int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };//自定义类型Point p{ 1, 2 };// C++11中列表初始化也可以适用于new表达式中int* pa = new int[4] { 0 };return 0;
}

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

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

结果如下:


2.2 std::initializer_list


  std::initializer_list是一个标准库类型,它允许以简便的方式初始化容器或其他对象。它是C++11引入的,它的主要目的是在不使用显式构造函数的情况下,实现统一的初始化语法。

   ✨initializer_list文档介绍,点击跳转

例如:

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

上述代码中就是一个std::initializer_list类型


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

#include<vector>
#include<list>
#include<map>
int main()
{vector<int> v = { 1,2,3,4 };list<int> lt = { 1,2 };// 这里{"sort", "排序"}会先初始化构造一个pair对象map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };// 使用大括号对容器赋值v = { 10, 20, 30 };return 0;
}

注意:初始化列表std::initializer_list是两个不同的概念。

  • 初始化列表是一种在对象创建过程中用于初始化成员变量或数组的语法。它使用花括号{}将初始值列表放在对象的构造函数或初始化器中。

  • std::initializer_list是一个标准库类型,在C++11中引入。它是一个模板类,用于在不使用显式构造函数的情况下,以统一的方式初始化容器或其他对象


3. 声明


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

3.1 auto


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

#include<map>
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();return 0;
}

结果如下:


有了auto自动推导类型之后,我们就可以省去写很长类型的麻烦了🥳🥳


3.2 decltype


  decltype是declaration type的缩写,在C++中,decltype是一个类型推断的关键字,用于获取表达式的类型。它可以用于声明变量、函数返回值类型以及模板参数类型的推断。和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有的自动类型推导场景,在某些特殊情况下auto用起来很不方便,甚至压根无法使用,例如:

int a = 0;
auto b = a;
decltype(a) c = b;
decltype(a) d = 10;

decltype的语法是decltype(expression) value,其中expression是一个表达式,value是变量名。关键字decltype将变量的类型声明为表达式指定的类型。

auto根据=右边的初始值推导出变量的类型,decltype根据expression表达式也就是上面的a推导出变量c或d的类型,跟=右边的b或10都没有关系。因此可以直接将10赋值给左边。

auto要求变量必须初始化,这是因为auto根据变量的初始值来推导变量类型的,如果不初始化,变量的类型也就无法推导;而decltype不要求,因此可以写成如下形式decltype(exp) varName;原则上讲,exp只是一个普通的表达式,它可以是任意复杂的形式,但必须保证exp的结果是有类型的,不能是void;如exp为一个返回值为void的函数时,exp的结果也是void类型,此时会导致编译错误。


3.3 nullptr

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

例如:

void func(void* ptr)
{cout << "func(void* ptr)";
}void func(int tmp)
{cout << "func(int tmp)";
}
int main()
{func(NULL);return 0;
}

本意是想让NULL匹配到指针参数

结果如下:


我们发现编译器将NULL匹配到了int类型那里,所以需要更明确的空指针——nullptr。


4. 范围for循环

  C++中的范围for循环是一种简化的循环结构,可以用来遍历容器、数组和其他可迭代对象中的元素。其语法如下:

for (element : collection) {// 循环体
}

其中,element是每次循环中的元素,collection是要遍历的容器、数组或可迭代对象。

范围for循环会自动迭代collection中的每个元素,并将每个元素依次赋值给element,然后执行循环体。循环体会针对每个元素执行一次,直到遍历完所有元素。

范围for循环适用于遍历容器和数组,例如:

std::vector<int> numbers = {1, 2, 3, 4, 5};for (int num : numbers) {std::cout << num << " ";
}

输出结果为:1 2 3 4 5

范围for循环也适用于遍历字符串:

std::string str = "Hello";for (char c : str) {std::cout << c << " ";
}

输出结果为:H e l l o

需要注意的是,范围for循环是只读的,不能修改集合中的元素。如果需要修改集合中的元素,可以使用传统的for循环或迭代器。

范围for循环在C++11中引入,可以提供一种更简洁、直观的遍历方式,减少了手动管理循环变量的复杂性。


5. 结语

  C++11的引入极大地扩展了C++的功能,并且提供了更加简洁和安全的编程方式。它为C++程序员提供了更多的选择和更好的性能,使得C++成为一种更加现代化和强大的编程语言。以上就是今天所有的内容啦~ 完结撒花~ 🥳🎉🎉

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

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

相关文章

minikube 实践练习4 - 滚动更新

1. 应用版本更新 #查看image kubectl describe pods#设置应用的image为新版本 v1 -> v2 kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcampdocker.io/jocatalin/kubernetes-bootcamp:v2#验证更新结果 export NODE_PORT"$(kubectl get services/…

糟糕界面集锦-控件篇11

GUI 的一个设计基本准则是&#xff1a;如果控件被禁用&#xff0c;那么就应该表现出来。这样不管是菜单项、命令按钮、列表框、下拉列表&#xff0c;我们只要一瞥就可以知道是否可用。奇怪的是为什么微软在按钮被禁用时不把它显示出来&#xff1f;这幅图片来自Office95 系列中的…

Redis操作--RedisTemplate(二)StringRedisTemplate

一、介绍 1、简介 由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型&#xff0c;Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展&#xff0c;分是 StringRedisConnection 和 StringRedisTemplate&#xff0c;作为字符串操作的解决方案。 通过源码…

【区块链+金融服务】第一创业证券开发银行间报价 Dapp | FISCO BCOS应用案例

在银行间市场现券交易的过程中&#xff0c;通过银保监会发牌的代理机构进行报价交易&#xff0c;已解决无代理阶段存在的许多问题。 但是由于业务需要&#xff0c;使用以前模式进行报价交易的仍占有一定比例。 针对这一现状&#xff0c;第一创业证券基于 FISCO BCOS 区块链底层…

多种办公功能的WORD VBA程序

word的VBA办公助手 源代码 Option Explicit 需要引用 excel 16.0 库 所有内容仅供个人学习使用&#xff0c;严禁传播。1-公共变量-表格属性------------------------------------------------------------------------- Dim Hg% hg:行高 Const K1 0.1 Dim Flg_bh As Boolean …

专业技能——Redis常用命令和持久化策略,内存回收策略+主从模式,哨兵模式,集群模式+缓存穿透击穿雪崩

Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c;散列&#xff08;hashes&#xff09;…

Kali Linux-设置系统24小时时间制

文章目录 设置系统24小时时间制 设置系统24小时时间制 在Kali Linux中&#xff0c;如果系统时间不是以24小时制显示&#xff0c;你可以通过修改系统时间格式配置文件来调整为24小时制。以下是具体的操作步骤&#xff1a; 1.编辑/etc/locale.conf配置文件。 vim /etc/locale.c…

微信云开发云存储 下载全部文件

一、安装 首先按照这个按照好依赖&#xff0c;打开cmd 安装 | 云开发 CloudBase - 一站式后端云服务 npm i -g cloudbase/cli 安装可能遇到的问题 ‘tcb‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。-CSDN博客 二、登录 在cmd输入 tcb login 三、…

VirtualBox安装Oracle Linux 7.9全流程

1.准备工作 1.1 VirtualBox下载 下载地址1&#xff1a; Downloads – Oracle VM VirtualBoxhttps://www.virtualbox.org/wiki/Downloads 下载地址2&#xff1a; https://www.oracle.com/virtualization/virtualbox/ 选择以上的任意一个地址都可下载到。 1.2 Oracle Linux 操作…

JavaScript初级——基础知识

一、JS的HelloWord 1、JS的代码需要编写到script标签中 2、JS的执行是根据语句从上到下一次执行的。 二、JS的编写位置 1、可以将js代码编写到标签的onclick属性中&#xff0c;当我们点击按钮时&#xff0c;js代码才会执行。 2、可以将js代码写在超链接的href属性中&#xff0…

HDFS的透明加密

一、HDFS透明加密原理 Hadoop的透明加密(HDFS Transparent Data Encryption) - TDE 1.HDFS中的数据明文存储 HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些block都是明文的。 通过Web UI页面找到Block的ID和副本位于的机器信息 如果在操作系统中直接访…

csrf漏洞(二)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文依靠phpstudy以及dvwa靶场进行操作&#xff0c;具体搭建流程参考&#xff1a;xss漏洞&#xff08;二&#xff0c;xss靶场搭建以及简单利用&#xff09; 前篇…

docker 部署 遇到的一些问题

1. nacos 部署问题 1.1 问题 springboot 服务器启动失败 AnnotationNacosPropertySourceBuilder - There is no content for NacosPropertySource from dataId[rsa.yaml] , groupId[DEFAULT_GROUP] , properties[{accessKey${nacos.access-key:}, clusterName${nacos.cluster…

leetcode387. 字符串中的第一个唯一字符,哈希表

leetcode387. 字符串中的第一个唯一字符 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2: 输入: s “loveleetcode” 输出: 2 示例…

Xilinx FPGA:vivado关于以太网的零碎知识点

一、OSI七层模型 为了实现网络通信的标准化&#xff0c;普及网络应用&#xff0c;国际标准化组织&#xff08;ISO&#xff09;将整个以太网通信结构制定了OSI模型&#xff0c;即开放式系统互联。 OSI定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、…

【leetcode】回文链表-25-3

方法&#xff1a;快慢指针递归遍历 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) …

宝塔面板部署webman项目+nginx反向代理

新建站点 新建一个站点&#xff0c;php版本选择纯净态即可&#xff0c;反正都是用不上的&#xff0c;域名填写你申请得到的域名 拉取代码 新建一个目录&#xff0c;然后将代码部署到本地 启动项目 推荐使用宝塔面板的进程守护管理器启动项目&#xff0c;其实就是用superviso…

快速体验fastllm安装部署并支持AMD ROCm推理加速

序言 fastllm是纯c实现&#xff0c;无第三方依赖的高性能大模型推理库。 本文以国产海光DCU为例&#xff0c;在AMD ROCm平台下编译部署fastllm以实现LLMs模型推理加速。 测试平台&#xff1a;曙光超算互联网平台SCNet GPU/DCU&#xff1a;异构加速卡AI 显存64GB PCIE&#…

[机器学习]全景指南:从基础概念到实战流程的全面解析

文章目录 1.引言1.1机器学习的重要性1.2机器学习的应用范围1.3本文的内容结构 2. 机器学习的基本概念与分类2.1 机器学习的定义2.2 机器学习的分类 4. 强化学习&#xff08;Reinforcement Learning&#xff09; 3. 机器学习的工作流程3.1 数据收集与准备1. 数据源与类型2. 数据…

Android进阶之路 - res、raw、assets 资源解析、区别对比

那天遇到一个资源目录层级的问题&#xff0c;索性重新整理记录一下&#xff0c;希望能帮到如吾往昔之少年的你们&#xff0c;哈哈哈哈哈哈… 一脸茫然&#xff0c;越写越多&#xff0c;时间成本属实有点大&#xff0c;就当一起来基础扫盲吧 resdrawablemipmapvaluescolor asset…