《Effective C++》

条款11 在operator=中处理“自我赋值”

自我赋值

证同测试:

if(this==&rhs)return*this;

影响并行处理效率

记住副本:

type* memberO=member;
pmember=new type(*rhs.member);
delete memberO;
return *this;

copy and swap:

class_type temp(rhs);
swap(rhs);
return *this;

条款30看不明白

条款39:明智而审慎地使用private继承

private继承只是一种代码实现方式而没有任何的意味

如果需要一个不含virtual函数和non-static成员变量的空基类,则可以使用private继承,表示EBO(empty base optimization,空白基类最优化)

条款40:明智而审慎地使用多重继承

钻石继承可以用virtual public解决

virtual bases的继承体积会变大,速度会变慢,所以尽量不要用,如果要用,尽可能避免在其中放置数据,类似于Java的接口

条款41:了解隐式接口和编译器多态

  • 对classes而言接口是显式的,以函数签名为中心,多态则是通过virtual函数发生于运行期。

    • 理解为classes定义完函数后,运行时通过virtual函数调用不同子类的函数。
  • 对template参数而言,接口是隐式的,奠基于有效表达式。多态则是通过template具现化和函数重载解析(function overloading resolution)发生于编译期。
    • 理解为template定义完函数后,只有拥有函数内调用的成员函数的类才能使用template函数,而在编译期内,就需要告知template使用的什么类。

《STL源码剖析》

特化:开一个特殊的模版类

const解引用获得右值

vector

第一个元素获得1,否则扩容成两倍,将元素逐个地从旧内存复制到新内存,然后将旧内存中的对象析构,且提供强异常安全保证。

《Effective Modern C++》:C++11之后能移动则移动,必须复制才复制,其中实现利用noexcept,使用std::move_if_noexcept和std::is_nothrow_move_constructible校验后移动。

deque

为多个缓冲区,sort时先搬到一个vector然后排序完搬回,使用一个索引表保存缓冲区

stack

template<class T,class Sequence=deque<T> >

默认底层实现为deque,可以传参实现其他构造

stack不提供迭代器

queue

同stack

heap

使用vector实现的堆,也可以使用array

priority_queue

底部是max-heap

slist

单向链表

set

底层红黑树,使用insert_unique()

map

底层红黑树,使用pair,按键值排序

multiset

和set基本相同,使用insert_equal()

multimap

和map基本相同,使用insert_equal()

《Effective Modern C++》

条款1:理解模版型别推导

在模版型别推导过程中

  • 具有引用型别的实参会被剥夺引用。
  • 万能引用形参推导时,传入左值实参时,T会被推导为左值引用(例如int&和const int&),右值会被推导为原类型(例如int),然后进行引用折叠。
  • 按值传递即为副本,例如const和volatile等饰词会被去掉。

数组退化成指针时,如果使用引用传递实参,则可以获得数组型别:

template<typename T>
void f(T &param); const char name[] = "J. p. Briggs";
f(name);

T的型别推导结果是const char [13],f的形参型别被推导为const char (&)[13]。

可以创造出一个模板推导数组含有的元素个数:

template<typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept {
return N;
} int keyVals[] = {1, 3, 7, 9, 11, 22, 35};
int mappedVals[arraySize(keyVals)];

条款2 理解auto型别推导

  • 在一般情况下,auto型别推导和模版型别推导是一模一样的,但是auto型别推导会假定用大括号括起的初始化表达式例如auto x{27}代表一个std::initializer_list,但模版类型推导却不会
  • 在函数返回值或lambda式的形参中使用auto,意思是使用模版类型推导而非auto型别推导

条款3 理解decltype

decltype(auto)中auto表示欲实施推导的型别,推导过程采用decltype的规则

Widget w;
const Widget& cw = w;
auto w1 = cw; // 去掉饰词,推导为Widget
decltype(auto) w2 = cw; // 理解为auto表示cw,decltype表示完美获取型别,型别为 const Widget&

条款8 优先选用nullptr,而非0或NULL

0和NULL在重载时会调用f(int)而非f(void*),nullptr的实际型别时std::nullptr_t,而std::nullptr_t可以隐式转换到所有的裸指针型别,这就是为何nullptr可以扮演所有型别指针的原因。

条款9 优先选用别名声明,而非typedef

  • tpyedef不支持模板化,别名声明支持
  • 别名模板可以让人免写::type后缀,且不需要typename前缀

一些类型变换工具:

std::remove_const_t<T>
std::remove_reference_t<T>
std::add_lvalue_reference_t<T>

条款12 为意在改写的函数添加override声明

  • 如题

  • 成员函数引用饰词使得对于*this为左值或右值时区别对待

    DataType &data() &{ return values; }
    DataType data() &&{ return std::move(values); }

条款15 只要有可能使用constexpr,就使用它

constexpr对象具备const属性,且在编译阶段就已知(严格说是翻译阶段)。

constexpr函数在调用时若传入的实参值是编译器已知的,则会产出编译期结果。

C++笔记(自用)的更多相关文章

  1. javascript基础知识笔记-自用

    笔记内容根据个人基础知识不足不明白之处做的记录.主要看的:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 1.变量,变量的名字又叫标识符 ...

  2. sql视频学习关键笔记(自用记单词与学习用)

    sql字段类型 numeric(18,3)-18位整数加3位小数点(货币计量最好选这类型) sql关键字 insert. update. delete alter grant 授权. revoke 回 ...

  3. [笔记]ACM笔记 - 自用模板

    长期更新. 快速幂 lld pow_mod(lld a, lld b, const int &pr) { lld ans = 1; while (b) { if (b & 1) ans ...

  4. Spring MVC框架下 从后台读取数据库并显示在前台页面【笔记自用 不推荐作为参考】

    1.书写jsp页面  people.jsp 1.设计显示格式以及内容显示 2.设计显示内容的范围 2.书写entity实体类 PeopleFormMap.java 书写传入的参数主要包括 要引用的数据 ...

  5. 自制spring中bean加载机制,仅做笔记自用

  6. yii的学习笔记 基本结构 自用

    Yii 学习笔记 W:YII是什么? Q:Yii 是一个基于组件的高性能 PHP 框架,用于快速开发大型 Web 应用.它使Web开发中的 可复用度最大化,可以显著提高你的Web应用开发速度.Yii ...

  7. Linux下main函数启动过程【程序员自我修养笔记】【自用】

    1. 入口函数和程序初始化 1.1 程序从main开始吗? 当程序执行到main函数的第一行时,很多事情都已经完成了: [证1]如下是一段C语言代码: 代码中可以看到,在程序刚刚执行到main的时候, ...

  8. wav音频文件格式解析【个人笔记】(自用)

    1. WAV格式 wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,相对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些.. 支持多种音频数字,取样频率和声道, ...

  9. Python自用笔记

    函数:raw_input()和input() 注意:在python3.x中,已经删除raw_input(),取而代之的是input(),当然这仅仅是重命名,用法还是一样.因此在这里介绍的是python ...

  10. Linux网络管理-相关笔记【自用】

    ISO/OSI七层模型应用层            APDU 应用层协议数据单元   越靠近用户表示层            PPDU 表示层协议数据单元会话层            SPDU 会话协 ...

随机推荐

  1. 【GiraKoo】重置Android Studio环境的几个方案

    [GiraKoo]重置Android Studio环境的几个方案 Android Studio经常在编译时,发现一些奇奇怪怪的编译/运行问题. 明明是很小的改动,但是出现了一些不相关的错误.搞不清楚究 ...

  2. shrio QuickStart

    Shrio三大对象:  springboot整合shrio 登录拦截认证 创建项目时勾选web,导入依赖: <dependency> <groupId>org.apache.s ...

  3. 2023-05-24:为什么要使用Redis做缓存?

    2023-05-24:为什么要使用Redis做缓存? 答案2023-05-24: 缓存的好处 买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处. 假设你在超市里买了一箱啤酒,如果你需要每次想喝啤酒就去超 ...

  4. 百度云原生数据库GaiaDB的HTAP与多地多活技术实践

    摘要:云原生数据库在使用存算分离技术后,可以在完全兼容MYSQL协议和语法的情况下,极大提升单实例所能承载的数据规模与吞吐能力上限.但除了对客户端兼容外,对整个数据生态(地域容灾,数据分析,备份恢复) ...

  5. 南洋才女,德艺双馨,孙燕姿本尊回应AI孙燕姿(基于Sadtalker/Python3.10)

    孙燕姿果然不愧是孙燕姿,不愧为南洋理工大学的高材生,近日她在个人官方媒体博客上写了一篇英文版的长文,正式回应现在满城风雨的"AI孙燕姿"现象,流行天后展示了超人一等的智识水平,行文 ...

  6. 绘图;OSPF 虚连接

    绘图;OSPF 虚连接 原图如下 绘图 实验拓扑 实验需求 按照图示分区域配置OSPF 配置虚连接认证 实验步骤 配置相应接口IP地址及loopback 环回口地址 按照图示分区域配置OSPF AR1 ...

  7. 文档在线预览(四)将word、txt、ppt、excel、图片转成pdf来实现在线预览

    @ 目录 事前准备 1.需要的maven依赖 2.后面用到的工具类代码: 一.word文件转pdf文件(支持doc.docx) 二.txt文件转pdf文件 三.PPT文件转pdf文件(支持ppt.pp ...

  8. .NET指定图片地址下载并转换Base64字符串

    需求描述 需要调用第三方图片上传接口上传图片,对方图片格式只能接收Base64字符串.所以我们需要将系统服务器的图片通过Url下载下来,然后转换成Base64字符串.接下来我们将使用HttpClien ...

  9. 实时光线追踪(3)Ray Casting

    目录 硬件光追(Hardware Ray Tracing) 加速结构(Acceleration Structure,AS) AS 策略 Ray Tracing Pipeline Ray Generat ...

  10. 如何从AWS中学习如何使用AmazonVPC

    目录 如何从 AWS 中学习如何使用 Amazon VPC? 随着 AWS 的迅速发展,Amazon VPC(Virtual Private Cloud)已经成为了一种非常重要的云计算基础设施.VPC ...