C++11中新特性介绍-之(一)

C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布。此次标准为C++98发布后13年来第一次重大修正。
那么C++11有哪些重要的修改呢?

1.字符串的原始字面量

使用R"ABC(raw string)ABC"的格式来解决如路径地址,换行等字符转义问题,其中ABC签后必须一样
如原本需要写成"D:\AAA\BB\ccc.txt)“的路径,可以使用R来代替:R”(D:\AAA\BB\ccc.txt)"
一行代码分成多行,用""连接,或者用"R()"给包起来
如果代码中的字符本身就表示他的原始含义,则不需要使用R转义符,只有当字符不能表示原始含义时需要R来修饰

2.空指针字符nullptr

用nullptr替换NULL,因为NULL在C语言中被定义为((void *)0),而在C++中,直接被定义为0,因为C++中不允许(void )转换为其他类型的,这就造成fun(int n)和fun(char p)无法区分的情况
nullptr是为C++量身定制的,可以自动隐式转换为对应的指针类型

3.constexpr修饰常量表达式

原理
原来的const有两种语义:定义只读变量和修饰常量,如:定义函数fun(const int num){const int nCount = 10; const int nRet = nCount+5; },其中形参num是制度变量不是常量,而函数内部的nCount和nRet则是常量,不是只读变量
程序编写到执行分为:预处理,编译,汇编,链接4个阶段,得到可执行程序才能运行,普通表达式是在运行阶段计算结果,而常量表达式是在编译阶段计算结果,这样极大的提高了程序运行效率
修饰变量
C++11中增加constexpr来修饰常量表达式,而const只用来修饰只读属性;所以上面函数改为:fun(const int num){constexpr int nCount = 10;constexpr int nRet = nCount+5; },这样修改后,nCount =10;和nCount+5就被认为式常量表达式,就会在编译期间计算出结果
修饰类对象
constexpr不能直接修饰struct结构体和class类,只能在struct或class创建对象时,用constexpr修饰为常量,并进行初始化。
例:struct T{int num;} fun(){constexpr T obj{20}; obj.num=5;},这时候obj.num=5是非法的,因为T中的num是常量了,不能被修改了
修饰函数
用constexpr修饰函数,被称为常量表达式函数,可修饰:普通函数/类成员函数,类构造函数,模板函数
constexpr修饰的函数,constexpr写在最前面,且函数必须要有返回值,并且return返回的表达式必须是常量表达式
例:constexpr int fun(){ constexpr int a=15; return a;},函数实现中,constexpr修饰函数,函数有返回值,返回值a是常量
constexpr修饰的常量表达式函数,必须要有函数的声明和定义
整个常量表达式函数的函数体中,不能出现非常量表达式之外的语句(using指令,typedef语句,static_assert断言,return语句除外)
constexpr可以修饰模板函数,但由于模板类型的不确定性,因此模板函数实例化后,函数是否符合常量表达式的函数要求也是不确定的,如果constexpr修饰的模板函数实例化结果不满足常量表达式的函数要求,则constexpr会被自动忽略

4.初始化列表

C11中统一了用{}大括号对任意类型的变量进行初始化
使用方式:
int a1 = {25};
int a2{30};
Animal animal{25,“zhangsan”};
Animal* animal = new Animal{28,“lucy”}
注意点:
1.类中有私有成员,不能使用初始化列表进行初始化;
2.类中有静态成员变量,不能对静态成员变量进行初始化;
3.类中不能有自定义的构造;
4.类不能有其父类;
5.类中不能有虚函数;

5.std::initializer_list使用

C11中提供了std::initializer_list可以让类模板实现接收任意长度的的同种类型的初始化列表

6.智能指针

智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存,解决C++中的内存回收问题
std::shared_ptr 共享智能指针
std::unique_ptr 独占智能指针
std::weak_ptr 弱引用智能指针

7.非范围的for循环

不以开头和结尾进行遍历,而是以容器中的元素进行枚举;并不能代替传统for循环,二者之间各有优缺点
语法:

vector<string> vctInfo;
//传统方式 
for(auto it = vctInfo.begin(); it != vctInfo.end(); ++it)
{cout << it << endl; }
//非范围方式
for(auto& it : vctInfo)
{cout << it << endl; }
int array art{1,3,5,7,9};
for(int n : art)
{ cout << n << endl; }
8.Lambda表达式

优点:就地匿名函数定义或函数对象,避免代码膨胀,在需要时,实现功能闭包,声明式编码风格,多用于有特定功能的,不重复使用的函数
语法:capture opt -> ret {body;};,其中capture是捕获列表,params是参数列表,opt是函数选项,ret是返回值类型,body是函数体
捕获列表可以捕获一定范围内的变量,具体使用方式如下:
[] - 不捕捉任何变量
[&] - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
[=] - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
拷贝的副本在匿名函数体内部是只读的
[=, &foo] - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
[bar] - 按值捕获 bar 变量, 同时不捕获其他变量
[&bar] - 按引用捕获 bar 变量, 同时不捕获其他变量
[this] - 捕获当前类中的this指针
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实现原理:1.内部先创建 lambda匿名类,实现构造函数,使用Lambda表达式的函数体重载operator()(也叫仿函数),然后创建对象,,再通过对象调用operator(),所以Lambda表达式本质上时一个函数对象

9.右值引用

使用"&&"来进行右值引用;用于实现移动语义和完美转发
右值引用可以绑定到临时对象(右值),通过将资源的所有权从一个对象转移到另一个对象,避免了不必要的复制和销毁操作,提高程序效率
右值引用还可以用于函数模板的完美转发,即将参数以原始的形式传递给下一个函数,避免了不必要的复制和类型转换,提高了程序效率
右值引用类型可能是左值也可能是右值
编译器会将已命名的右值引用视为左值,将未命名的右值引用视为右值
通过右值推导 T&& 或者 auto&& 得到的是一个右值引用类型,其余都是左值引用类型
auto&&或者函数参数类型自动推导的T&&是一个未定的引用类型,它可能是左值引用也可能是右值引用类型,这取决于初始化的值类型

10.转移和完美转发

std::forward()完美转发函数,右值引用类型是独立于值的,一个右值引用作为函数参数的形参时,在函数内部转发该参数给内部其他函数时,它就变成一个左值,并不是原来的类型了。如果需要按照参数原来的类型转发到另一个函数,需可以用std::forward()完美转发
std::move()函数实现转喻,将佐治转换为右值;使用move几乎没有不需要拷贝过程,只是转换了资源的所有权。使用方法:
Test t;
Test && v2 = move(t);
将上面的Test类对象t从左值转移为右值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节码编程javassist之定义方法和返回值

写在前面 源码 。 本文看下如何使用javassist来定义方法和返回值。 1&#xff1a;源码 package com.dahuyou.javassist.generateFieldAndMethod;import javassist.*;import java.lang.reflect.Method;public class JustDoIt222 {public static void main(String[] args) thr…

数值分析笔记(五)线性方程组解法

三角分解法 A的杜利特分解公式如下&#xff1a; u 1 j a 1 j ( j 1 , 2 , ⋯ , n ) , l i 1 a i 1 / u 11 ( i 2 , 3 , ⋯ , n ) , u k j a k j − ∑ m 1 k − 1 l b m u m j ⇒ a k j ( j k , k 1 , ⋯ , n ) , l i k ( a i k − ∑ m 1 k − 1 l i n u m k ) /…

苹果电脑能玩赛博朋克2077吗 如何在mac上运行赛博朋克2077 crossover能玩什么游戏

各位喜欢赛博朋克风的一定不能错过《赛博朋克2077》。那么《赛博朋克2077》是一款什么样的游戏&#xff1f;《赛博朋克2077》在苹果电脑上可以运行吗&#xff1f;一起来看看介绍吧。 一、《赛博朋克2077》是一款什么样的游戏&#xff1f; 《赛博朋克2077》是一款由CD Projekt …

[激光原理与应用-98]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 2 - 什么是激光器焊接? 常见的激光焊接技术详解

目录 一、什么是激光焊接 1.1 概述 1.2 激光焊接的优点 二、激光焊接的应用 2.1 哪些场合必须使用激光焊接 1. 汽车制造业 2. 航空航天领域 3. 电子行业&#xff1a;消费类电子3C 4. 医疗器械制造 5. 新能源锂电池行业 6. 其他领域 三、激光焊接的分类 3.1 按焊接…

【SpringBoot】SpringBoot自动装配原理

在上一篇文章中&#xff0c;讲述了 SpringBoot核心启动流程源码解析 其中&#xff0c;主要是构造方法和run方法的处理&#xff0c;本篇接着准备上下文环境后续&#xff0c;讲述是如何将springboot是如何完成自动装配&#xff0c;主线其实就是 什么时候完成 对主类的加载&#…

Spring Boot基础篇

快速上手 SpringBoot是由Pivotal团队提高的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始化搭建以及开发过程 入门案例 在Idea创建 创建时要选择Spring Initializr。 Server URL为要连接的网站&#xff0c;默认为官网start.spring.io&#xff08;访问速度慢&…

Node.js 生成vue组件

在项目根目录下创建 create.js /*** 脚本生成vue组件* 主要是利用node自带的fs模块操作文件的写入* ===========================================* 准备步骤:* 1.输入作者名* 2.输入文件名* 3.输入菜单名* 4.输入文件地址* ============================================* 操…

CTS单测某个模块和测试项

1 &#xff0c;测试单个模块命令 run cts -m <模块名> 比如&#xff1a;run cts -m CtsUsbTests模块名可以从测试报告中看&#xff0c;如下&#xff1a; 2&#xff0c; 测试单个测试项 run cts -m <模块名> -t <test_name> 比如&#xff1a;run cts -m ru…

【新能源时代!看大模型(LLMs)如何助力汽车自动驾驶!】

文末有福利&#xff01; 引言 本文主要介绍大模型(LLMs)如何助力汽车自动驾驶&#xff0c;简单来说&#xff0c;作者首先带大家了解大模型的工作模式&#xff0c;然后介绍了自动驾驶大模型的3大应用场景&#xff0c;最后指出自动驾驶大模型将会是未来的发展趋势&#xff0c;只…

浏览器怎么抓包?Wireshark详细教程奉上!

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

Android 添加LBS辅助定位

1.软件需求&#xff1a; 某Android设备没有sim卡但其支持定位&#xff0c;客户需求为在已有的Android中添加LBS网络定位&#xff0c;用以辅助gps定位。 2.思路分析 首先看到这个需求笔者是比较懵逼的&#xff0c;秉持着客户是上帝的原则&#xff0c;笔者首先先了解了一下什么…

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(7)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督继续为大家带来系列——小学生都能玩的语音模块&#xff0c;帮你一周内快速学会语音模块的使用方式&#xff0c;打造一个可用于智能家居、物联网领域的语音助…

通过SDK使用百度智能云的图像生成模型SDXL

登录进入百度智能云控制台&#xff0c;在模型广场按照图像生成类别进行筛选&#xff0c;可以找到Stable-Diffusion-XL模型。点击Stable-Diffusion-XL模型的API文档后在弹出的新页面下拉可以找到SDK调用的说明。 import qianfandef sdxl(file: str, prompt: str, steps: int 2…

商品分页,商品模糊查询

一、商品分页 引入分页 定义分页主件的参数 在请求url上拼接参数 定义改变当前页码后触发的事件&#xff0c;把当前页码的值给到分页表单&#xff0c;重新查询 二、商品查询&#xff08;以商品的名称查询name为例&#xff09; 引入elementplus的from表单组件 定义一个FormData…

Spring源码十二:事件发布源码跟踪

上一篇我们在Spring源码十一&#xff1a;事件驱动中&#xff0c;介绍了spring refresh方法的initMessageSource方法与initApplicationEventMulticaster方法&#xff0c;举了一个简单的例子进行简单的使用的Spring为我们提供的事件驱动发布的示例。这一篇我们将继续跟踪源码&…

创建React项目

使用 create-react-app快速搭建开发环境 create-react-app 是一个快速创建React开发环境的工具&#xff0c;底层由Webpack构建&#xff0c;封装了配置细节&#xff0c;开箱即用。 安装npx npx是一个由Node.js官方提供的用于快速执行npm包中的可执行文件的工具&#xff0c;np…

如何给gitlab其他访问者创建账号并增加权限

嗨&#xff0c;今天创建了项目之后&#xff0c;我想把项目链接发送给其他人&#xff0c;让他下载这个项目&#xff0c;结果发现对方打开显示登录的界面&#xff0c;没错&#xff0c;他要想使用这个git下载项目&#xff0c;首先他的有一个git账号 接下来我找有权限的相关人员给他…

C语言之常用内存函数以及模拟实现

目录 前言 一、memcpy的使用和模拟实现 二、memmove的使用和模拟实现 三、memset的使用和模拟实现 四、memcmp的使用和模拟实现 总结 前言 本文主要讲述C语言中常用的内存函数&#xff1a;memcpy、memmove、memset、memcmp。内容不多&#xff0c;除了了解如何使用&#x…

前端根据目录生成模块化路由routes

根据约定大于配置的逻辑&#xff0c;如果目录结构约定俗成&#xff0c;前端是可以根据目录结构动态生成路由所需要的 route 结构的&#xff0c;这个过程是要在编译时 进行&#xff0c;生成需要的代码&#xff0c;保证运行时的代码正确即可 主流的打包工具都有对应的方法读取文…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

#在生产环境中部署Elasticsearch&#xff1a;最佳实践和故障排除技巧——聚合与搜索&#xff08;三&#xff09; 前言 文章目录 前言- 聚合和分析- 执行聚合操作- 1. 使用Java API执行聚合操作- 2. 使用CURL命令执行聚合操作- 1. 使用Java API执行度量操作- 2. 使用CURL命令执…