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厂商、安全专家和学者等齐聚盛会,零距离共话智能网联汽车产业的新发展、新趋势。 知从科技董事长成云霞亲自带…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
