C++笔记(自用)
《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 ¶m);
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++笔记(自用)的更多相关文章
- javascript基础知识笔记-自用
笔记内容根据个人基础知识不足不明白之处做的记录.主要看的:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 1.变量,变量的名字又叫标识符 ...
- sql视频学习关键笔记(自用记单词与学习用)
sql字段类型 numeric(18,3)-18位整数加3位小数点(货币计量最好选这类型) sql关键字 insert. update. delete alter grant 授权. revoke 回 ...
- [笔记]ACM笔记 - 自用模板
长期更新. 快速幂 lld pow_mod(lld a, lld b, const int &pr) { lld ans = 1; while (b) { if (b & 1) ans ...
- Spring MVC框架下 从后台读取数据库并显示在前台页面【笔记自用 不推荐作为参考】
1.书写jsp页面 people.jsp 1.设计显示格式以及内容显示 2.设计显示内容的范围 2.书写entity实体类 PeopleFormMap.java 书写传入的参数主要包括 要引用的数据 ...
- 自制spring中bean加载机制,仅做笔记自用
- yii的学习笔记 基本结构 自用
Yii 学习笔记 W:YII是什么? Q:Yii 是一个基于组件的高性能 PHP 框架,用于快速开发大型 Web 应用.它使Web开发中的 可复用度最大化,可以显著提高你的Web应用开发速度.Yii ...
- Linux下main函数启动过程【程序员自我修养笔记】【自用】
1. 入口函数和程序初始化 1.1 程序从main开始吗? 当程序执行到main函数的第一行时,很多事情都已经完成了: [证1]如下是一段C语言代码: 代码中可以看到,在程序刚刚执行到main的时候, ...
- wav音频文件格式解析【个人笔记】(自用)
1. WAV格式 wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,相对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些.. 支持多种音频数字,取样频率和声道, ...
- Python自用笔记
函数:raw_input()和input() 注意:在python3.x中,已经删除raw_input(),取而代之的是input(),当然这仅仅是重命名,用法还是一样.因此在这里介绍的是python ...
- Linux网络管理-相关笔记【自用】
ISO/OSI七层模型应用层 APDU 应用层协议数据单元 越靠近用户表示层 PPDU 表示层协议数据单元会话层 SPDU 会话协 ...
随机推荐
- 【GiraKoo】Android系统版本代号一览
Android系统版本代号一览 Version CodeName API 时间 13.0 Tiramisu 33 2022.08 12.0 Snow Cone 31,32 2021.10 11.0 R ...
- 【重学C++】04 | 说透C++右值引用(上)
文章首发 [重学C++]04 | 说透C++右值引用(上) 引言 大家好,我是只讲技术干货的会玩code,今天是[重学C++]的第四讲,在前面<03 | 手撸C++智能指针实战教程>中,我 ...
- 源代码管理工具——Git
Git是一个开源的分布式版本控制系统,用于管理软件开发中的版本控制和协作.通过Git,开发人员可以记录文件的修改历史.协作开发,以及在多个分支上进行实验性开发.Git已成为现代软件开发中不可或缺的工具 ...
- 【Python&目标识别】调用百度智能云API实现植被识别
百度智能云于2015年正式对外开放运营,以"云智一体"为核心赋能千行百业,致力于为企业和开发者提供全球领先的人工智能.大数据和云计算服务及易用的开发工具.凭借先进的 ...
- CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(上篇)
前言 考虑到 B+ 树较为复杂,CMU15-445 将 B+ 树实验拆成了两部分,这篇博客将介绍 Checkpoint#1 部分的实现过程,搭配教材 <DataBase System Conce ...
- 重新温习git
在本地文件夹创建项目,使用git bash here,然后使用git clone[url]命令克隆,提示权限不足, 这是需要ssh重置了 1.删除原有.ssh文件下的known_hosts 2.设置用 ...
- Electron App 安装包定制 -- Inno Setup 脚本 Pascal Scripting 初探
在做 Electron 项目时,有个需求是安装包安装时要给客户机上装上某个软件 在查看 Inno Setup 官网后发现是通过 .iss 脚本编写实现自定义安装过程 可在 .iss 内可以添加脚本为安 ...
- 使用GoEasy快速实现Android原生app中的websocket消息推送
摘要: GoEasy带来了一项令开发者振奋的消息:全面支持Android原生平台!现在,您可以在Android应用中使用最酷炫的实时通信功能,借助GoEasy轻松实现消息的发送和接收.本文将带您领略G ...
- 数据库连接池之c3p0-0.9.1.2,16年的古董,发生连接泄露怎么查(一)
背景 这篇文章是写给有缘人的,为什么这么说呢,因为本篇主要讲讲数据库连接池之c3p0-0.9.1.2版本. 年轻的朋友,可能没怎么听过c3p0了,或者也仅限于听说,这都很正常,因为c3p0算是200几 ...
- 图像处理评价指标_划分系数Vpc划分熵Vpe
划分系数划分熵 评价指标划分系数Vpc和划分熵Vpe能够反映分割矩阵的模糊程度,Vpc数值越大,分割矩阵的模糊性越小,分割效果越好:Vpe数值越小,像素分类越准确,分割效果越好. (1)划分系数Vpc ...