Effective Modern C++ 笔记

news2024/9/27 5:42:54

Effective Modern C++

本文是Effective Modern C++学习笔记,以细碎的知识点记录的形式来记录学习过程。

简介:
1、Effective Modern C++目标:学习怎样高效地使用新机能
2、移动语义(C++11): 右值表明这个对象适合移动操作,而左值一般不适合。右值对应于从函数返回的临时对象,而左值对应于你可以引用的(can refer to)对象,或者通过名字,或者通过指针或左值引用。对于判断一个表达式是否是左值的一个有用的启发就是,看看能否取得它的地址。
如果能取地址,那么通常就是左值。如果不能,则通常是右值
3、当使用另一个同类型的对象来初始化一个对象时,新的对象被称为是用来初始化的对象的一个副本(copy),尽管这个副本是通过移动构造函数创建的。

右值副本通常由移动构造产生,左值副本通常由拷贝构造产生。

4、在函数调用中,调用地传入的表达式称为函数的实参。实参被用来初始化函数的形参。实参和形参的区别非常重要,因为形参是左值,而用来初始化形参的实参可能是左值或者右值
5、通过lambda表达式创建的函数对象称为闭包
6、申明和定义:

  • 声明(declarations)引入名字和类型,并不给出比如存放在哪或者怎样实现等的细节
  • 定义(definitions)提供存储位置或者实现细节

7、std::auto_ptr在C++11中被废弃,但std::unique_ptr可以做同样的工作,而且做的更好。

第1章 类型推导

条款一:理解模板类型推导 : Understand template type deduction

1、C++98就有了类型推导,C++11起加入了autodecltype,c++14对其可能使用的范围进行了拓展。

2、只有在传值给形参时才会忽略const(和volatile)

3、函数不能声明形参为真正的数组,但是可以接受指向数组的引用;在直接传递数组的时候,数组会退化成指针形式。函数类型也会退化为一个函数指针。
3、auto依赖于模板类型推导
在这里插入图片描述
条款二:理解auto类型推导 : Understand auto type deduction
1、auto的特殊情况:对于花括号的处理是auto类型推导和模板类型推导唯一不同的地方。

auto x3 = { 27 };                  //类型是std::initializer_list<int>,x3值是{ 27 }  OK
auto x4{ 27 };                     //同上  OK
auto x5 = { 1, 2, 3.0 };           //错误!无法推导std::initializer_list<T>中的T   ,花括号里面包含的是不同类型的变量,编译器会拒绝这样的代码.

auto createInitList()
{
    return { 1, 2, 3 };            //错误!不能推导{ 1, 2, 3 }的类型
}

2、在C++14中auto允许出现在函数返回值或者lambda函数形参中,但是它的工作机制是模板类型推导那一套方案,而不是auto类型推导。

总之就是不要使用auto 推导花括号类型,这个活他干不了!
在这里插入图片描述

条款三:理解decltype : Understand decltype

decltype: 给它一个名字或者表达式decltype就会返回这个名字或者表达式的类型。在C++11中,decltype最主要的用途就是用于声明函数模板,而这个函数返回类型依赖于形参类型。vector除外!
在函数形参列表后面使用一个->符号指出函数的返回类型,尾置返回类型的好处是我们可以在函数返回类型中使用函数形参相关的信息。
C++14中可以使用decltype(auto):auto说明符表示这个类型将会被推导,decltype说明decltype的规则将会被用到这个推导过程中。
decltype(auto)的使用不仅仅局限于函数返回类型,当你想对初始化表达式使用decltype推导的规则,你也可以使用:

Widget w;
const Widget& cw = w;
auto myWidget1 = cw;                    //auto类型推导 myWidget1的类型为Widget
decltype(auto) myWidget2 = cw;          //decltype类型推导 myWidget2的类型是const Widget&

用小括号覆盖一个名字可以改变decltype对于名字产生的结果:在:int x = 0;中,x是一个变量的名字,所以decltype(x)是int。但是如果用一个小括号包覆这个名字,比如这样(x) ,就会产生一个比名字更复杂的表达式。对于名字来说,x是一个左值,C++11定义了表达式(x)也是一个左值。因此decltype((x))是int&。
所以,当使用decltype(auto)的时候一定要加倍的小心,在表达式中看起来无足轻重的细节(比如一个小括号)将会影响到decltype(auto)的推导结果。
在这里插入图片描述

条款四:学会查看类型推导结果 : Know how to view deduced types

  • IDE编辑器: 在IDE中的代码编辑器通常可以显示程序代码中变量,函数,参数的类型,你只需要简单的把鼠标移到它们的上面,这种方式适用于比较简单的推导。
  • **编译器诊断:**先声明一个类模板但不定义,尝试实例化这个类模板就会引出一个错误消息,因为这里没有用来实例化的类模板定义。在编译器中编译的报错中可以看到类型。
  • 运行时输出:
std::cout << typeid(x).name() << '\n';  //显示x和y的类型
std::cout << typeid(y).name() << '\n';

但是,std::type_info::name的结果并不总是可信的,可以使用Boost:

boost::typeindex::type_id_with_cvr()获取一个类型实参

在这里插入图片描述

第2章 auto

条款五:优先考虑auto而非显式类型声明: Prefer auto to explicit type declarations

auto变量从初始化表达式中推导出类型,所以我们必须初始化。lambda表达式中的形参也可以使用auto(C++14起)。
vectoer .size()可以使用auto推导
显式的指定类型可能会导致不希望看到的类型转换,使用auto可以避免很难被意识到的类型不匹配的错误,这样无疑更具效率,且更容易书写。
在某些情况下如果你的专业判断告诉你使用显式类型声明比auto要更清晰更易维护,那你就不必再坚持使用auto。
在这里插入图片描述
条款六:auto推导若非己愿,使用显式类型初始化惯用法 :
Item 6 : Use the explicitly typed initializer idiom when auto deduces undesired types

慎重使用auto当有可能出现std::vector<bool>
作为一个通则,不可见的代理类通常不适用于auto。
解决方案是强制使用一个不同的类型推导形式,这种方法我通常称之为显式类型初始器惯用法。显式类型初始器惯用法使用auto声明一个变量,然后对表达式强制类型转换(cast)得出你期望的推导结果。举个例子:

auto highPriority = static_cast<bool>(features(w)[5]);

在这里插入图片描述
列举几个学习网站:

  • Effective Modern C++中文翻译版1
  • Effective Modern C++中文翻译版2

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unable to Locate package python2 | Linux Ubuntu系统下python2和cif2cell的安装

Linux Ubuntu系统下python2的安装 安装键入命令和报错如下&#xff1a; 背景&#xff1a;官方早年前已经宣布停止 Python 2 的更新和服务&#xff0c;所以对于ubuntu20版本之后的&#xff0c;都是自带安装了python3&#xff0c;但是我们在处理安装某些大型科学计算程序的时候…

【python百炼成魔】python之字典详解

前言 今天我们一起来探讨python的另外一种类型&#xff1a; 字典&#xff0c;如果你没有看过列表和元组&#xff0c;建议先学习列表和元组。 【python百炼成魔】python之元组详解 【python百炼成魔】python之列表详解 文章目录 前言字典的概念语法格式及字典的创建字典的日常…

广告数仓:可视化展示

系列文章目录 广告数仓&#xff1a;采集通道创建 广告数仓&#xff1a;数仓搭建 广告数仓&#xff1a;数仓搭建(二) 广告数仓&#xff1a;全流程调度 广告数仓&#xff1a;可视化展示 文章目录 系列文章目录前言一、FineBI1.FineBI下载2.软件安装3.配置数据库 二、数据可视化1…

I3C协议手册研读-2

阿兴的理解 I3C的时序主要包括SDR模式、HDR模式(HDR-DDR、HDR-TSP、HDR-TSL) 阿兴的理解 上图主要介绍了SDR模式&#xff0c;SDR模式下的波形远看很像I2C波形&#xff0c;因此可以被逻辑分析仪识别到。此外&#xff0c;SDR较I2C增加了一些新的特征。 阿兴的理解 图中很好的绘制…

Unity 事件监听与广播(高度解耦合,观察者模式)

文章目录 1. 目的2. 主要思路3. 基础类4. EventCenter 事件中心类5. 测试 1. 目的 使用观察者模式降低模块间的耦合性 2. 主要思路 通过C# 的 Dictionary 存放事件码和事件的委托添加事件&#xff1a; 判断字典是否有该事件码&#xff0c;没有添加判断当前委托类型与添加的事…

微客云接口支持话费充值,大批量充值更方便

目前话费作为生活中的必需品&#xff0c;只要使用手机就一定会用到话费充值。 但是目前市场上可供话费充值的渠道比如&#xff1a;支付宝、微信、各大银行app&#xff0c;只能单笔充值&#xff0c;如果有几百几千个号码&#xff0c;只能单笔去充值&#xff0c;根本是不可能实现…

Qt实现拖拽功能(支持拖放文件、拖放操作)

目录 拖放Qt程序接受其他程序的拖拽部件/控件之间相互拖放总结 拖放 拖放是在一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式。除了为剪贴板提供支持外,通常它还提供数据移动和复制的功能。 拖放操作包括两个截然不同的动作:拖动和放下。Qt窗口部件可以…

津津乐道设计模式 - 享元模式详解(以影院座位举例让你快速掌握)

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

itext 7批量生成pdf文件并以压缩包形式下载

itext 7批量生成pdf文件并以压缩包形式下载 引入jar <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.0.3</version><type>pom</type></dependency>代码实现–生成…

逻辑漏洞小结之SRC篇(值得收藏,反复看!)

​​​​​最近在挖各大src&#xff0c;主要以逻辑漏洞为主&#xff0c;想着总结一下我所知道的一些逻辑漏洞分享一下以及举部分实际的案例展示一下&#xff0c;方便大家理解。 主要从两个方面看&#xff0c;业务方面与漏洞方面。&#xff08;接下来就从拿到网站的挖掘步骤进行…

如何使用模板化消息进行客户服务?(参考salesmartly)

如何使用模板化消息进行客户服务&#xff1f;&#xff08;参考salesmartly&#xff09; 一整天一遍又一遍地重复相同的答案可能会很乏味&#xff0c;尤其是对于您的客户服务团队而言。模板化消息&#xff0c;也称为预制回复或回复模板&#xff0c;已成为许多客户服务团队必备功…

Kong(Without DB)的安装和基本使用

下载和安装 Docs 这里以Centos为例 sudo yum install kong-enterprise-edition-3.3.0.0.rpm配置 ​ Kong的官网提供了两个配置模式一个是 Using a database 另一个是使用 yaml配置文件的形式&#xff0c;安装好后默认配置文件默认是/etc/kong/kong.conf.default 二者对比 …

React V6实现类似与vue的eventBus

功能背景 想要实现类似于vue的eventBus的功能&#xff0c;由一个组件通知其他一个或多个组件。应用场景&#xff1a;比如一个可视化大屏的界面&#xff0c;当筛选条件变化的时候&#xff0c;要同时通知到大屏中所有图表一起变化。&#xff08;当然使用store也是可以的&#xff…

逻辑回归算法实现

目录 1.关于逻辑回归的原理解析和准备工作 2.关于激活函数 3.关于数据集 4.编写LogisticsRegression类 5.逻辑回归测试 6.结果 1.关于逻辑回归的原理解析和准备工作 逻辑回归原理相关内容&#xff0c;请参考博主的另一篇文章&#xff1a;机器学习&#xff08;二&#xff…

菜鸟重磅推出多款科技新品,“工业大脑”PLC国产化获突破

“决策参谋”供应链计划、“工业大脑”PLC、“智能制造”科技解决方案……6月28日&#xff0c;在2023全球智慧物流峰会上&#xff0c;菜鸟自研的一批新产品、新方案正式曝光。菜鸟物流科技深耕制造业的成绩单也在峰会期间公布&#xff0c;华晨宝马等一批头部汽车企业已与其展开…

六种提高自己工作效率的方法!

为什么同样的时间&#xff0c;同样的都在休息都在玩&#xff0c;而别人工作却在玩的同时已经完成了一大半了。究竟是怎么做到的呢&#xff1f; 不仅仅是因为别人的工作效率高&#xff0c;而是因为他们会巧用工具。 那么你肯定想知道&#xff0c;这款工具是什么样的呢&#xf…

hutool工具类实现excel上传 支持03和07

一直感觉excel表的导入有很多代码&#xff0c;写一次忘一次&#xff0c;类太多&#xff0c;要知道怎么获取Workbook、Sheet、Cell、row等等&#xff0c;这么多类不可能一直记的住&#xff0c;都是写过之后保存&#xff0c;使用的时候拿出来改改&#xff0c;更烦人的是针对offic…

Vue Router replace 编程式导航 缓存路由组件

6.9.路由跳转的 replace 方法 作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式&#xff1a;push和replace push是追加历史记录replace是替换当前记录&#xff0c;路由跳转时候默认为push方式 开启replace模式 <router-link :replac…

松翰单片机keil环境芯片包

松翰单片机keil环境芯片包&#xff08;SN8F5700系列&#xff09;&#xff1a;安装时与Keil安装位置相同可以直接使用。 安装后依次点击可查看芯片包具体型号&#xff1a; 芯片包下载链接&#xff1a;阿里云盘分享https://www.aliyundrive.com/s/TnHchMhYeh1

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和定序器编程的技术背景Baumer工业相机通过BGAPISDK进行定序器编程功能1.引用合适的类文件2.Baumer工业相机通过BGA…