当前位置: 首页 > news >正文

【C++】<知识点> C++11新特性

文章目录

     一、auto关键字

二、decltype关键字

三、nullptr关键字

四、智能指针

五、 无序容器(哈希表)

六、统一的初始化方法

七、成员变量默认初始值

八、范围for循环

九、右值引用与移动语义

十、lambda表达式


一、auto关键字

1. 作用:C++11引入了auto来自动推断变量类型,简化代码。在编译时,编译器会自动推断变量类型并将auto替换成实际类型。

2. 注意事项:

  • 以前版本的auto表示变量是自动存储。但这是编译器的默认规则,所以写不写都一样,使得 auto关键字非常鸡肋。
  • auto在修饰变量时需要马上初始化,否则编译器无法推断。
  • auto不能修饰函数形参。
  • auto不能修饰数组。
  • 如果表达式包含&、const和volatile,则推断时不包含这三个。若想声明为上述三种类型,则需要手动添加,如下:
int num1 = 0;
int& num2 = num1;
auto a = num2;//此处推断为int
auto& b = num2;//此处推断为int&

3. 应用场景:

  • 场景一:在使用容器迭代器时,使用auto可以简化代码。
  • 场景二:用于泛型编程,某些场景下可以少写一个泛型类型。
  • 场景三:使用auto推断lambda类型。若不使用auto,则要使用std::function。

二、decltype关键字

1. 作用:C++11增加了decltype来自动推断变量类型。

2. 基本语法:

decltype(表达式) 变量名

3. 使用示例:

3.1 基于表达式

int a = 0;
double b = 1.2;
decltype(a + b) c;//a+b的类型为double,所以c的类型也是double

3.2 基于函数返回值

int fun() {return 0;
}decltype(fun()) a;//推断为int

3.3 基于引用&、const、volatile

int a = 0;
int& num = a;
decltype(num) c = a;//此处c被推断为int&

4. decltype与auto的区别:

  • ①auto不能用于推断引用&、const、volatile,而decltype可以。
  • ②auto直接修饰变量,并且需要马上初始化;decltype需要给定一个推断的表达式,修饰的变量不需要马上初始化。

三、nullptr关键字

1. 作用:C++11增加了nullptr表示空指针。

2. 基本使用:

int* p = nullptr;
int* q = NULL;
if (p == q)cout << "相等" << endl;//会输出“相等”

3. nullptr与NULL的区别:

  • ①nullptr是C++11新特性中新增的,NULL是之前版本就有的。
  • ②nullptr可读性更高且更实用,NULL在某些编译器里被视为整数0或(void* )0。因此,对于某些函数重载来说,NULL可能会导致函数调用的二义性。

四、智能指针

C++ 新特性 | C++ 11 | 智能指针这篇博客已经写得很不错了。


 五、 无序容器(哈希表)

1. 作用:C++11提供了无序容器unordered_map。与map类似也是保存key-value,但是map的插入和查找时间复杂度为O(log n),而哈希表的插入和查找时间复杂度为O(1)

2. 基本使用:与map操作一样,如下给出示例:

unordered_map<string, int> umap;
umap.insert(make_pair("kkk", 18));
umap.insert(make_pair("xxx", 19));
umap.insert(make_pair("yyy", 17));
umap["llll"] = 28;
auto p = umap.find("kjc");
if (p != umap.end())cout << p->second << endl;//最终打印18
elsecout << "未找到" << endl;

 六、统一的初始化方法

C++11提供了变量初始化统一的方式,即在初始化时使用{},如下代码所示:

int a{ 1 };
string s{'h', 'e', 'l'};
vector<int> v{1, 2, 3};
int* p = new int[8] {4, 5, 6};//剩下的元素自动为0

七、成员变量默认初始值

类似JAVA,在类中定义成员变量时可以给一个默认的初始值,如下所示:

class A {
public:int a = 10;
};std::cout << A().a << std::endl;//打印10

八、范围for循环

1. 作用:C++11提供了范围for循环,简化了遍历代码。

2. 基本语法:

for (类型名 变量名 : 目标变量名) {...
}

3. 使用实例:

vector<int> v{ 1,2,3,4,5 };
//范围for循环:将v里的所有元素*10
for (int& i : v) {i *= 10;
}
//普通for循环:最终打印10 20 30 40 50
for (int i = 0; i < v.size(); ++i) {cout << v[i] << " ";
}

4. 注意事项:

  • ①要使用范围for循环,循环的范围必须是确定的。
  • ②要使用范围for循环,循环的对象必须能够实现++和--。

九、右值引用与移动语义

1. 左值与右值:简单来说,左值就是能取地址的,右值无法取地址。

2. 左值引用与右值引用:以前接触的都是左值引用,而右值引用是对右值的引用,如下所示:

int i = 0;
int& j = i;//左值引用
string&& s = string("hhh");//右值引用

3. 移动语义作用:“抢”别人的空间,不需要深拷贝,提升程序执行效率。对于一些临时的匿名对象,该对象执行完就会被析构,移动语义就能将它内部的空间“抢过来”,而不用再深拷贝开辟一个空间。

4. 移动语义实现前提:自定义类中需要写出移动拷贝构造函数(参数是右值引用)移动赋值运算符重载(参数是右值引用)。那么,在主程序中调用move方法就会将某个变量转变成右值,从而调用移动拷贝构造函数和移动赋值运算符重载。在它们函数内部,不用new新空间,而是直接把形参的空间赋值给自定义类的属性。注意:通过上述操作虽然无需进行深拷贝,但是传入的参数空间会发生改变。

5. 详细说明:见C++ 新特性 | C++ 11 | 移动语义与右值引用-CSDN博客。


十、lambda表达式

1. 作用:创建匿名函数。

2. 使用示例:

int num[4]{4, 2, 11, 33};
//匿名函数作为sort的排序规则
sort(num, num + 4, [](int x, int y)->bool {return x < y; });
//匿名函数作为for_each的遍历规则
for_each(num, num + 4, [](int num) {cout << num << " " << endl; });

3. 详细说明:见【C++】<总览> 基础知识-CSDN博客中的第八章的4.

相关文章:

  • 视觉大模型(VLLM)学习笔记
  • 华为策略流控
  • 网络编程(UPD和TCP)
  • 拓扑排序-java
  • 类和对象的学习总结(一)
  • Android --- MVVM+DataBinding+Fragment+Retrofit+Adapter 简单示例
  • Django学习(1)Model
  • Qt图标字体文件中提取字体保存为图片
  • iOS18 新变化提前了解,除了AI还有这些变化
  • Java基础知识:为面试做好准备
  • 店匠科技亮相VivaTech,新零售解决方案引关注
  • 如何使用GPT-4o函数调用构建一个实时应用程序?
  • Apache ShardingSphere实战与核心源码剖析
  • 数字模拟EDA研发环境搭建
  • 文件的基础必备知识(初学者入门)
  • 《深入 React 技术栈》
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Asm.js的简单介绍
  •  D - 粉碎叛乱F - 其他起义
  • echarts花样作死的坑
  • go语言学习初探(一)
  • MySQL几个简单SQL的优化
  • Redash本地开发环境搭建
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Terraform入门 - 3. 变更基础设施
  • TypeScript实现数据结构(一)栈,队列,链表
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从tcpdump抓包看TCP/IP协议
  • - 概述 - 《设计模式(极简c++版)》
  • 聊聊flink的TableFactory
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 安徽锐锋科技IDMS系统简介
  • $().each和$.each的区别
  • $.proxy和$.extend
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot教学评价 毕业设计 641310
  • 、写入Shellcode到注册表上线
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET MVC之AOP
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 发展历程
  • .Net 路由处理厉害了
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .sys文件乱码_python vscode输出乱码
  • :“Failed to access IIS metabase”解决方法
  • @Async注解的坑,小心
  • @media screen 针对不同移动设备
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • []FET-430SIM508 研究日志 11.3.31
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [BZOJ] 3262: 陌上花开
  • [C++]C++类基本语法
  • [FT]chatglm2微调
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [Java并发编程实战] 共享对象之可见性