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

C++11 特性

总结

  • 语法糖:
    • 关键字:
      • autodecltype
      • nullptr
      • overridefinal
      • constexpr
    • 语法:
      • 基于范围的 for 循环。
      • function 函数对象。
        • lambda 产生函数对象。
        • bind 产生函数对象。
    • 目的:写代码更便捷、更严谨,让编译器做更多的事情。
  • STL 容器:
    • array
    • forward_list
    • unordered_mapunordered_set
  • 智能指针:shared_ptrweak_ptrunique_ptr
  • 多线程:threadmutexlock_guardcondition_variableatomic
  • 右值引用:
    • T &&
    • 将亡值 → 会触发移动构造或移动赋值构造。
    • 实现移动语义 → std::move
    • 实现完美转发 → 万能引用 T && 用来接收参数 + std::forward

C++ 类型推导用法

  • 类型推导的场景:
    • 模板参数类型的推导(和 auto 类型推导的规则是一致的)。
    • C++11 引入了 autodecltype(在编译期进行类型推导)。
  • 为什么要引入类型推导 ?
    • C++ 是强类型语言,用编译器来处理类型推导,可以提升语言的编码效率。
  • 类型推导的关键字:
    • auto
      • 原理:用于推导变量的类型通过强制声明一个变量的初始值编译器会通过初始值进行类型推导
      • 规则:
        • auto 变量必须在定义时进行初始化。
        • 如果用 auto 定义多个变量,那么这些变量必须为同一类型。
        • auto 不能推导数组类型,会推导出指针类型。
        • C++14 auto 可以推导函数的返回值类型。
        • 类型推导时会丢失引用或 constvolatile 语义使用 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开发插件&#xff0c;快速地开发AR应用。 专栏&#xff1a; Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可更多地关注Unity场景内容的制作。 热更方案 基于Hybri…...

【江科大STM32学习笔记】新建工程

1.建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 2.工程文件夹里建立Start、Library、User等文件夹&#xff0c;复制固件库里面的文件到工程文件夹 为添加工程文件准备&#xff0c;建文件夹是因为文件比较多需要分类管理&#xff0c;需要用到的文件一定要复…...

C++小程序:同一路由器下两台计算机简单通信(1/2)——服务器端

同一路由器下两台电脑如何进行通信呢&#xff1f;这里通过小程序实例的方式介绍SOCKET结构体以及相关函数的使用。计算机通信是在服务器端与客户端之间进行&#xff0c;这里先介绍服务器端程序。 我这里编辑编译软件是VS2022&#xff0c;使用C空项目进行编程。在介绍程序…...

EditReady for Mac激活版:专业视频转码工具

对于视频专业人员来说&#xff0c;一款高效的视频转码工具是不可或缺的。EditReady for Mac正是这样一款强大的工具&#xff0c;它拥有简洁直观的操作界面和强大的功能&#xff0c;让您的视频处理工作事半功倍。 EditReady for Mac支持多种视频格式的转码&#xff0c;并且支持常…...

Android app通过jcifs-ng实现Samba连接共享文件夹

Android端使用Samba连接共享文件夹&#xff0c;下载或上传文件的功能实现。如果你是用jcifs工具包&#xff0c;那么你要注意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…...

预编码算法学习笔记

预编码算法是无线通信系统中的一项关键技术&#xff0c;它能够在发送端对信号进行处理&#xff0c;以提高系统的可靠性和频谱效率。以下是关于预编码算法的详细学习笔记。 1. 引言 在无线通信系统中&#xff0c;由于存在多径效应、信号衰减以及干扰等因素&#xff0c;接收到的…...

2024OD机试卷-最长子字符串的长度(一) (java\python\c++)

题目:最长子字符串的长度(一) 题目描述 给你一个字符串 s,首尾相连成一个环形,请你在环中找出 ‘o’ 字符出现了偶数次最长 子字符串 的长度。 输入描述 输入是一个小写字母组成的字符串 输出描述 输出是一个整数 用例1 输入 alolobo 输出 6 用例2 输入 looxdolx …...

docker 部署并运行一个微服务

要将微服务部署并运行在Docker容器中&#xff0c;你需要按照以下步骤操作&#xff1a; 编写Dockerfile&#xff1a;在项目根目录下创建一个名为Dockerfile的文件&#xff0c;并添加以下内容&#xff1a; # 使用一个基础的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

概述&#xff1a; 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技术微调步骤详解

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…...

如何使用client-go构建pod web shell

代码示例及原理 原理是利用websocket协议实现对pod的exec登录&#xff0c;利用client-go构造与远程apiserver的长连接&#xff0c;将对pod容器的输入和pod容器的输出重定向到我们的io方法中&#xff0c;从而实现浏览器端的虚拟终端的效果消息体结构如下 type Connection stru…...

AI工具摸索-关于写作(1)

虽然人工智能工具非常多,但是如果想要成为生产力,能达标的工具仍然非常少,除了最常用的chatgpt,其他的工具真的能达标吗,这篇文章主要就是对比市面上的一些工具&#xff0c; 但我这个人非常执拗,我认为作为生产力工具的功能必然是可以真正帮助我们的,而不是说作为一个写作工具结…...

昂科烧录器支持O2Micro凹凸科技的电池组管理IC OZ7708

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中O2Micro凹凸科技的电池组管理IC OZ7708已经被昂科的通用烧录平台AP8000所支持。 OZ7708是一款高度集成、低成本的电池组管理IC&#xff0c;适用于5~8s Li-Ion/Polymer电池组&a…...

Spring Cloud Gateway详解

文章目录 Gateway搭建路由&#xff08;route&#xff09;断言&#xff08;Predicate &#xff09;自定义断言 过滤器&#xff08;filter&#xff09;自定义全局过滤器 引言 在传统的单体项目中&#xff0c;前端和后端的交互相对简单&#xff0c;只需通过一个调用地址即可实现。…...

信息系统项目管理师0103:初步可行性研究(7项目立项管理—7.2项目可行性研究—7.2.2初步可行性研究)

点击查看专栏目录 文章目录 7.2.2初步可行性研究1.初步可行性研究定义2.辅助研究的目的和作用3.初步可行性研究的作用4.初步可行性研究的主要内容记忆要点总结7.2.2初步可行性研究 1.初步可行性研究定义 初步可行性研究一般是在对市场或者客户情况进行调查后,对项目进行的初步…...

Linux 系统中,nl命令用于计算文件中的行号

在 Linux 系统中&#xff0c;nl命令用于计算文件中的行号。它可以将输出的文件内容自动加上行号&#xff0c;并且可以通过不同的选项来设置行号的显示方式&#xff0c;包括行号的位数、是否自动补齐 0 等。其命令格式为&#xff1a;nl(选项)…(文件)…。以下是一些常见的选项&a…...

知从科技战略客户经理张志强受邀出席2024 AutoSec中国汽车网络安全与数据安全峰会

4月11-12日&#xff0c;AutoSec8周年年会暨中国汽车网络安全及数据安全合规峰会在上海成功举办。此次峰会吸引了来自全球各地的头部汽车网络安全企业、OEM厂商、安全专家和学者等齐聚盛会&#xff0c;零距离共话智能网联汽车产业的新发展、新趋势。 知从科技董事长成云霞亲自带…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...