C++11 特性
总结
- 语法糖:
- 关键字:
auto、decltype。nullptr。override、final。constexpr。
- 语法:
- 基于范围的
for循环。 function函数对象。lambda产生函数对象。bind产生函数对象。
- 基于范围的
- 目的:写代码更便捷、更严谨,让编译器做更多的事情。
- 关键字:
- STL 容器:
array。forward_list。unordered_map、unordered_set。
- 智能指针:
shared_ptr、weak_ptr、unique_ptr。 - 多线程:
thread、mutex、lock_guard、condition_variable、atomic。 - 右值引用:
T &&。- 将亡值 → 会触发移动构造或移动赋值构造。
- 实现移动语义 →
std::move。 - 实现完美转发 →
万能引用 T &&用来接收参数 +std::forward。
C++ 类型推导用法
- 类型推导的场景:
- 模板参数类型的推导(和
auto类型推导的规则是一致的)。 - C++11 引入了
auto、decltype(在编译期进行类型推导)。
- 模板参数类型的推导(和
- 为什么要引入类型推导 ?
- C++ 是强类型语言,用编译器来处理类型推导,可以提升语言的编码效率。
- 类型推导的关键字:
auto:- 原理:用于推导变量的类型,通过强制声明一个变量的初始值,编译器会通过初始值进行类型推导。
- 规则:
auto变量必须在定义时进行初始化。- 如果用
auto定义多个变量,那么这些变量必须为同一类型。 auto不能推导数组类型,会推导出指针类型。C++14 auto可以推导函数的返回值类型。- 类型推导时会丢失引用或
const、volatile语义 → 使用auto &解决。volatile定义的变量不会被编译器优化,每次访问这样的变量时都需要直接从内存中读取其值。volatile并不意味着线程安全,它仅仅保证对变量的直接访问。
- 万能引用
auto &&→ 根据初始值的属性来判断是左值引用还是右值引用。const int &i = 5; // i 是左值引用auto &&m = i; // m 是左值引用 auto &&n = 10; // n 是右值引用template <typename T> void func(T &&t) { // 万能引用,既可以传左值,也可以传右值当你传递一个左值给 func 时,模板参数 T 会被推导为左值引用类型 T&。因此 T && 实际上变成了 T& &&。根据引用折叠规则(Reference Collapsing Rules),T& && 折叠为 T&。当你传递一个右值给 func 时,T 会被推导为该值的类型,所以 T && 直接就是一个右值引用。 }
- 应用:
- 尽量使用
auto声明变量(因为auto变量必须在定义时进行初始化),除非影响可读性。 - 使用容器时,迭代器类型名很长。
- 匿名函数的返回值。
auto lambda = [](auto x, auto y) -> auto { return x + y; }; cout << lambda(5, 3) << endl; // 8 cout << lambda(2.3, 1.7) << endl; // 4 - 模板函数中,可以节约一个模板参数类型。
template <typename T> void print(T value) {std::cout << value << std::endl; }void print(auto value) {std::cout << value << std::endl; }
- 尽量使用
decltype:- 原理:用于推导表达式的类型,编译器只分析表达式类型而不实际运算。
- 规则:
exp是一个普通的表达式,推导表达式类型。exp是函数调用,推导函数返回值类型。exp是左值,推导出左值引用。
- 应用:用于泛型编程。
int a = 1; float b = 2.0; decltype(a + b) c = a + b; cout << "a + b = " << c << typeid(c).name() << endl; // a + b = 3fauto f = [](int a, double b) {return a + b; }; decltype(f(a, b)) d = b; cout << "d = " << d << typeid(d).name() << endl; // d = 2ddecltype(a += b) e = a; e = 18; cout << "a = " << a << endl; // a = 18 /*对于表达式 a += b,这是一个复合赋值表达式,它的结果是 a 本身的左值。在 C++ 中,复合赋值表达式(如 +=、-=、*= 等)是左值表达式,它们返回对象的左值引用。 */
nullptr 和 NULL 的区别
nullptr专门用来表示空指针。它的类型是nullptr_t,可以自动转换成任何指针类型,但不能转换成整数类型,这提供了更高的类型安全性。NULL被定义为整数 0。可能会在重载函数中引发歧义。例如,如果有两个重载函数,一个接受整型参数,另一个接受指针参数,使用NULL可能导致调用接受整型的版本,而不是预期的指针版本。
void func(int) {std::cout << "Integer version called." << std::endl;
}void func(int*) {std::cout << "Pointer version called." << std::endl;
}int main() {// 可能调用 func(int), 也可能调用 func(int*), 因为 NULL 被视为 0// 所以编译器无法确定调用哪个版本,导致编译报错func(NULL); func(nullptr); // 明确调用 func(int*)
}
关键字 override、final 的作用
- C++11 引入了这两个关键字。
- 为什么要引入这两个关键字 ?
- 虚函数重写。
- 不能阻止某个虚函数进一步被重写。
- 本意是写一个新函数,但是由于子类中
virtual关键字可省略,导致重写了基类的虚函数。 - 本意是重写基类的虚函数,但是由于函数签名不一致,导致在子类中构建了新的虚函数。
- 类继承:不能阻止某个类进一步派生。
- 虚函数重写。
override:- 指定子类的一个虚函数重写基类的一个虚函数。
- 保证该重写的虚函数与基类的虚函数具有相同的函数签名。
class A { public:virtual void Func() {} }; class B : public A { public:void Func() override {} };
final:- 指定某个虚函数不能在派生类中被重写,或者某个类不能被派生
相关文章:
C++11 特性
总结 语法糖: 关键字: auto、decltype。nullptr。override、final。constexpr。语法: 基于范围的 for 循环。function 函数对象。 lambda 产生函数对象。bind 产生函数对象。目的:写代码更便捷、更严谨,让编译器做更多的事情。STL 容器: array。forward_list。unordered_…...
二、使用插件一键安装HybridCLR
预告 本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。 专栏: Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可更多地关注Unity场景内容的制作。 热更方案 基于Hybri…...
【江科大STM32学习笔记】新建工程
1.建立工程文件夹,Keil中新建工程,选择型号 2.工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹 为添加工程文件准备,建文件夹是因为文件比较多需要分类管理,需要用到的文件一定要复…...
C++小程序:同一路由器下两台计算机简单通信(1/2)——服务器端
同一路由器下两台电脑如何进行通信呢?这里通过小程序实例的方式介绍SOCKET结构体以及相关函数的使用。计算机通信是在服务器端与客户端之间进行,这里先介绍服务器端程序。 我这里编辑编译软件是VS2022,使用C空项目进行编程。在介绍程序…...
EditReady for Mac激活版:专业视频转码工具
对于视频专业人员来说,一款高效的视频转码工具是不可或缺的。EditReady for Mac正是这样一款强大的工具,它拥有简洁直观的操作界面和强大的功能,让您的视频处理工作事半功倍。 EditReady for Mac支持多种视频格式的转码,并且支持常…...
Android app通过jcifs-ng实现Samba连接共享文件夹
Android端使用Samba连接共享文件夹,下载或上传文件的功能实现。如果你是用jcifs工具包,那么你要注意jcifs-ng 和 jcifs 支持的SMB版本区别。 JCIFS-NG的github地址 JCIFS官网地址 这里有关于jciffs、jcifs-codelibs、jcifs-ng、smbj的详细介绍 对比 支…...
linux开发笔记(buildroot打包镜像)
参考文章:https://www.cnblogs.com/arnoldlu/p/9553995.html mangopi_r3的buildroot在编译完成后会将所有镜像打包到一起。与之有关的buildroot配置项为 BR2_ROOTFS_POST_IMAGE_SCRIPT"board/allwinner/generic/scripts/genimage.sh" genimage.sh内容如下 #!/bin…...
预编码算法学习笔记
预编码算法是无线通信系统中的一项关键技术,它能够在发送端对信号进行处理,以提高系统的可靠性和频谱效率。以下是关于预编码算法的详细学习笔记。 1. 引言 在无线通信系统中,由于存在多径效应、信号衰减以及干扰等因素,接收到的…...
2024OD机试卷-最长子字符串的长度(一) (java\python\c++)
题目:最长子字符串的长度(一) 题目描述 给你一个字符串 s,首尾相连成一个环形,请你在环中找出 ‘o’ 字符出现了偶数次最长 子字符串 的长度。 输入描述 输入是一个小写字母组成的字符串 输出描述 输出是一个整数 用例1 输入 alolobo 输出 6 用例2 输入 looxdolx …...
docker 部署并运行一个微服务
要将微服务部署并运行在Docker容器中,你需要按照以下步骤操作: 编写Dockerfile:在项目根目录下创建一个名为Dockerfile的文件,并添加以下内容: # 使用一个基础的Docker镜像 FROM docker-image# 将项目文件复制到容器…...
Hive on Tez 作业优化参数
常用参数 参数名 参数说明 默认值 所在配置文件 关联问题 hive.tez.container.size Tez AppMaster向RM申请的container大小 -(单位:MB) hive-site.xml OOM tez.runtime.io.sort.mb 这个参数设定了 Tez 运行排序操作时可用的最大内存。排序操作的内存大小也会影响到排序的效率…...
flink mysql数据表同步API CDC
概述: CDC简介 Change Data Capture API CDC同步数据代码 package com.yclxiao.flinkcdcdemo.api;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ververica.cdc.connectors.mysql.source.MySqlSource; import com.verv…...
AI大模型探索之路-训练篇21:Llama2微调实战-LoRA技术微调步骤详解
系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…...
如何使用client-go构建pod web shell
代码示例及原理 原理是利用websocket协议实现对pod的exec登录,利用client-go构造与远程apiserver的长连接,将对pod容器的输入和pod容器的输出重定向到我们的io方法中,从而实现浏览器端的虚拟终端的效果消息体结构如下 type Connection stru…...
AI工具摸索-关于写作(1)
虽然人工智能工具非常多,但是如果想要成为生产力,能达标的工具仍然非常少,除了最常用的chatgpt,其他的工具真的能达标吗,这篇文章主要就是对比市面上的一些工具, 但我这个人非常执拗,我认为作为生产力工具的功能必然是可以真正帮助我们的,而不是说作为一个写作工具结…...
昂科烧录器支持O2Micro凹凸科技的电池组管理IC OZ7708
芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中O2Micro凹凸科技的电池组管理IC OZ7708已经被昂科的通用烧录平台AP8000所支持。 OZ7708是一款高度集成、低成本的电池组管理IC,适用于5~8s Li-Ion/Polymer电池组&a…...
Spring Cloud Gateway详解
文章目录 Gateway搭建路由(route)断言(Predicate )自定义断言 过滤器(filter)自定义全局过滤器 引言 在传统的单体项目中,前端和后端的交互相对简单,只需通过一个调用地址即可实现。…...
信息系统项目管理师0103:初步可行性研究(7项目立项管理—7.2项目可行性研究—7.2.2初步可行性研究)
点击查看专栏目录 文章目录 7.2.2初步可行性研究1.初步可行性研究定义2.辅助研究的目的和作用3.初步可行性研究的作用4.初步可行性研究的主要内容记忆要点总结7.2.2初步可行性研究 1.初步可行性研究定义 初步可行性研究一般是在对市场或者客户情况进行调查后,对项目进行的初步…...
Linux 系统中,nl命令用于计算文件中的行号
在 Linux 系统中,nl命令用于计算文件中的行号。它可以将输出的文件内容自动加上行号,并且可以通过不同的选项来设置行号的显示方式,包括行号的位数、是否自动补齐 0 等。其命令格式为:nl(选项)…(文件)…。以下是一些常见的选项&a…...
知从科技战略客户经理张志强受邀出席2024 AutoSec中国汽车网络安全与数据安全峰会
4月11-12日,AutoSec8周年年会暨中国汽车网络安全及数据安全合规峰会在上海成功举办。此次峰会吸引了来自全球各地的头部汽车网络安全企业、OEM厂商、安全专家和学者等齐聚盛会,零距离共话智能网联汽车产业的新发展、新趋势。 知从科技董事长成云霞亲自带…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
