Effective Modern C++ 笔记(6):Lambda Expressions
Chapter 6 Lambda Expressions首先要搞清楚几个概念:
lambda 表达式:就是一个表达式,是代码本身:
c++1[](int val) { return 0 < val && val < 10; }
closure:由 ...
Effective Modern C++ 笔记(5):Rvalue References, Move Semantics and Perfect Forwarding
Chapter 5 Rvalue References, Move Semantics and Perfect ForwardingItem 23 Understand std::move and std::forward
std::move 和 std::forward 在运行时刻不做任何事( ...
Effective Modern C++ 笔记(4):Smart Pointers
Chapter 4 Smart Pointers使用裸指针有以下几个问题:
从裸指针的声明中不能看出其指向的是一个对象还是一个数组。
从裸指针的声明中不能看出是否需要释放它,以及怎样释放。
很难保证裸指针释放且仅被释放一次。
没有办法得知裸指针是否悬空了。
智能指针解决了这些问题。
Item ...
Effective Modern C++ 笔记(3):Moving to Modern C++
Chapter 3 Moving to Modern C++Item 7 Distinguish between () and {} when creating objects
C++11 引入了 uniform initialization (即用花括号括起来的一组值)来解决原先圆括号初始化的 ...
Effective Modern C++ 笔记(2):auto
Chapter 2 autoItem 5 Prefer auto to explicit type declarations在定义变量时,相较于显式地指定其类型,使用 auto 有以下优点:
强制初始化
避免用于初始化的表达式类型和声明的类型不一致,从而导致可移植性或执行效率的问题
更改一处 ...
Effective Modern C++ 笔记(1):Intro & Deducing Types
Introduction
argument 是实参,可以是左值也可以是右值;
parameter 是形参,一定是左值。
basic exception safety guarantee 是指发生异常后程序的不变量仍然得到保证以及没有资源被泄露;
strong exception safety g ...
C++:从源代码到可执行文件
从源代码到可执行文件大概可分为四步:
预处理(gcc -E),产物为 .i 文件(翻译单元)
#include 替换,#define 宏展开,#ifdef 条件编译等等
编译(gcc -S),产物为 .s 汇编文件
汇编(gcc -c),产物为 .o 目标文件(可重定位目标文件)
链接(gc ...
C++ 中的类型转换
C++ 提供了四种用于类型转换的关键字:dynamic_cast, static_cast, reinterpret_cast 和 const_cast。
dynamic_cast
dynamic_cast 只能用于转换指向对象的指针或者对象的引用(对象所属的类需要有继承关系)。
在有继承关系的多 ...
C++ 中的 template
模板在编译时刻展开,每有一个不同的模板实参列表,就会有一个对应的模板实例。
所以模板的定义要和声明放在一起(不能分别放在头文件和源文件中),因为编译器在实例化模板时需要知道模板是怎么定义的。
如果函数模板中有 static 变量,那么实例化出来的每个模板函数都有自己独立的 static 变量。r ...
C++11 中的多线程
C++11 中为了更好地支持多线程,引入了一些新的功能。
std::thread
std::thread 作为一个类,其构造函数的作用是创建一个新线程并执行,构造函数有一个可变长的参数列表,第一个参数为一个 callable,后面的参数是该 callable 的入参。
有三种 callable: ...