《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_noexceptstd::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),然后进行引用折叠。
  • 按值传递即为副本,例如constvolatile等饰词会被去掉。

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

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. Python分割多空格字符方法

    问题: 现有一个字符串 "1 + 5" ,想要获取 1,+,5 这三个元素 做法: str.split(' ') ['1', '', '', '', '', '', '+', '' ...

  2. AcWing 1230. K倍区间

    给定一个长度为 N 的数列,A1,A2,-AN,如果其中一段连续的子序列 Ai,Ai+1,-Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K倍区间. 你能求出数列中总共有多少个 K倍区间 ...

  3. 基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》

    在上一篇中构思了把查询子句描述出来的数据结构,那么能否用代码将其表达出来,如何表达呢? 再次回顾考察,看下面的查询子句: Id>1 and Id<10 如上所示,有两个独立的条件分别为Id ...

  4. C#/VB.NET:如何从 PowerPoint 演示文稿中提取文本

    在学习或者日常工作中,有时我们需要把幻灯片的东西整理成文字,而从 PowerPoint 演示文稿中一张一张的整理手动复制粘贴,整个过程会非常费精力且耗时.那么怎么样才能比较轻松且快速地提取PowerP ...

  5. ODOO13之七:Odoo 13开发之记录集 – 使用模型数据

    在上一篇文章中,我们概览了模型创建以及如何从模型中载入和导出数据.现在我们已有数据模型和相关数据,是时候学习如何编程与其进行交互 了.模型的 ORM(Object-Relational Mapping ...

  6. OWASP移动应用安全测试指南中文版

    OWASP移动应用安全测试指南(MASTG)是OWASP移动应用安全(MAS)旗舰项目的一部分,是一本涵盖移动应用安全分析过程.技术和工具的综合手册,也是一套详尽的测试案例,用于验证OWASP移动应用 ...

  7. 文档在线预览(三)使用js前端实现word、excel、pdf、ppt 在线预览

    @ 目录 实现方案 一.docx文件实现前端预览 1.docx-preview 2.Mammoth 二.PDF文件实现前端预览 1.pdf.js 2.pdfobject.js 3.vue-pdf 4. ...

  8. 如何将mp4文件解复用并且解码为单独的.yuv图像序列以及.pcm音频采样数据?

    一.初始化解复用器 在音视频的解复用的过程中,有一个非常重要的结构体AVFormatContext,即输入文件的上下文句柄结构,代表当前打开的输入文件或流.我们可以将输入文件的路径以及AVFormat ...

  9. HCL 实验7:OSPF

    拓扑图 R1配置 [R1]int g0/1 [R1-GigabitEthernet0/1]ip add 192.168.4.1 24 [R1-GigabitEthernet0/1]undo shutd ...

  10. windows ce 5.0 + vs2005 + sql数据库_开发注意事项

    今天通过对RFID读写器(windows ce 5.0)的摸索以及实验总结出一下注意事项: 安装 vs2005 后要配置windows ce 的开发环境,从网上下载对应设备版本的SDK,安装后新建项目 ...