第四章
*头文件的代码一般不应该使用using声明
左值:当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
右值:当对象被用作右值的时候,用的是对象的值(内容)。
*赋值运算符需要一个(非常量)左值做的其左侧运算对象,得到的结果也仍然是一个左值。
*取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,这个指针是右值。
*内置解引用运算符,下标运算符,迭代器解引用运算符,string和vector的下标运算符的求值结果都是左值。
*内置类型和迭代器的递增减运算符作用于左值运算对象,其前置版本所得的结果也是左值。
第七章
Mutable 关键字
Explicit 关键字
*聚合类(aggregate class) 老版本的struct 类
第九章
*顺序容器: forward_list(单向链表), array(数组)
选择容器的基本原则
*除非你由很好的理由选择其他容器,否则应使用vector
*如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list
*随机访问元素, 使用vector或deque
*需要在头尾位置插入或删除元素,但不会在中间位置进行插入或删除,则使用deque
*读取输入时才需要在容器中间插入元素,随后需要随机访问元素,则:
---vector追加数据,然后调用sort函数
---如果必须在中间插入元素,考虑在输入阶段使用list, 输入完成后list中的内容拷贝到一个vector
第十章
*lambda不能有默认的参数
*bind函数,普通函数
第12章
*Shared_ptr: 允许多个指针指向同一个对象。
*Unique_Ptr: “独占”所指向的对象。
*Weak_ptr: 伴随类,弱引用,指向 shared_ptr所管理的对象。
*Shared_ptr 独有的操作:
make_shared, shared_ptr, p = q, p.unique(), p.use_count()
*使用智能指针语法 shared_ptr<A> a1(new A());
*某个时刻只能有一个unique_ptr指向一个给定对象。
*unique_ptr被摧毁时,它所指向的对象也被摧毁。
*weak_ptr指向由一个shared_ptr管理的对象。weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被摧毁,对象就会被释放。
第十三章
*拷贝构造函数不应该是explicit的
*三/五法则:
拷贝构造好书,拷贝赋值运算符,析构函数,移动构造函数,移动赋值运算符
*如果需要一个析构函数,我们几乎肯定也需要一个拷贝构造函数和一个拷贝赋值运算符
*Sales_data() = default;
*Sales_data() = delete; 阻止拷贝
*不能delete 析构函数;~Sales_data() = delete 错误
*swap 函数 自定义
*拷贝并交换 (copy and swap) ????
*move函数
*右值引用,&& 来获取右值引用
*一个左值的表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值
*左值持久: 右值短暂
*右值要么是字面常量,要么是在表达式求值过程中创建的临时对象。
*移动构造函数不分配任何新内存
*五个拷贝控制成员应该看成一个整体,定义任何一个拷贝操作,则应该定义所有五个操作。
第十四章
*函数对象
*lambda表达式 auto mod = [](int i, int j) { return i %j; } ;
*function 关键字 可以放入 函数指针,函数对象,lambda表达式
Function<int(int,int)> f1 = add; //函数指针
Function<int(int,int)> f2 = divide(); //函数对象
Function<int(int,int)> f3 = [] (int i, int j) { return i%j; }; //lambda
第十五章
*final 关键字
第十六章
*std::move
其他 略
第十七章
*tuple 类型
希望将一些数据组合成单一对象,但又不想定义一个新的结构来表示,tuple是非常有用的。
*bitset
*正则表达式: RE库
*随机数
第十八章
*内联命名空间 inline namespace FifthEd {}
*虚继承
第十九章
略
//
//
其他重要知识点:
*std::mem_fn
*std::ref
*多线程相关函数
*std::future
*std::packaged_task
*std::async
//
现代C++教程:高速上手C++11/14/17/20
//
*nullptr 替换 NULL
* constexpr int len_foo_constexpr() {
return 5;
}
char arr_6[len_foo_constexpr() + 1]; // 合法
*std::initializer_list
MagicFoo(std::initializer_list<int> list) {
for (std::initializer_list<int>::iterator it = list.begin();
it != list.end(); ++it)
vec.push_back(*it);
}
MagicFoo magicFoo = { 1, 2, 3, 4, 5 };
*多个返回值
std::tuple<int, double, std::string> f()
{
return std::make_tuple(1, 2.3, "456");
}
*decltype
+用法和typeof相似
auto x = 1;
auto y = 2;
decltype(x + y) z;
+委托构造
class Base {
public:
int value1;
int value2;
Base() {
value1 = 1;
}
Base(int value) : Base() { // 委托 Base() 构造函数
value2 = value;
}
};
+继承构造
class Base {
public:
int value1;
int value2;
Base() {
value1 = 1;
}
Base(int value) : Base() { // 委托 Base() 构造函数
value2 = value;
}
};
class Subclass : public Base {
public:
using Base::Base; // 继承构造
};
* 显示禁用默认构造好书
+ Magic() = default;
+Magic& operator=(const Magic&) = delete;
*强类型枚举
enum class new_enum : unsigned int {
value1,
value2,
value3 = 100,
value4 = 100
};
*左值:表达式后依然存在的持久对象。
*右值:表达式结束后就不再存在的临时对象。
*右值分为:纯右值,将亡值
*纯右值(pure rvalue):要么是纯粹的字面值,要么是求值结果相当于字面量或匿名临时对象。
+例如:1, 2, 1+2, 非引用返回的临时变量,运算表达式产生的临时变量,原始字面量,Lambda表达式。
+字符串字面量只有在类中才是右值, 其位于普通函数中是左值。
*将亡值(expiring value):即将被摧毁,却能够被移动的值。
*std::array: 固定大小的数组
*std::forward_list: 单向链表
*无序容器: 使用 hash表来实现, 插入搜索复杂度为 O(constant)
+std::unordered_map/std::unordered_multimap , std::unodered_set/std::unordered_multiset;
*std::shared_ptr: 记录共同指向一个对象。Std::make_shared来分配创建传入参数中的对象。
+auto pt = std::make_shared<int> (10);
+unique_ptr 不支持复制和赋值,unique_ptr 只支持移动
+shared_ptr 通常使用在共享权不明的场景。有可能多个对象同时管理同一个内存时。
+对象的延迟销毁。陈硕在《Linux 多线程服务器端编程》中提到,当一个对象的析构非常耗时,甚至影响到了关键线程的速度。可以使用 BlockingQueue<std::shared_ptr<void>> 将对象转移到另外一个线程中释放,从而解放关键线程。
+避免使用裸指针型别的变量来创建 std::shared_ptr 指针
*std::unique_ptr: 独占的智能指针,它禁止其他智能指针与其共享一个对象。
+unique_ptr 代表的是专属所有权,即由 unique_ptr 管理的内存,只能被一个对象持有。
*std::weak_ptr: 不会引起引用计数增加。它的唯一作用就是坚持std::shared_ptr是否存在,其expired()方法能在资源未被释放时会返回false,否则返回true。
+weak_ptr是一种不控制所指向对象生存期的智能指针,指向shared_ptr管理的对象,但是不影响shared_ptr的引用计数。它像shared_ptr的助手,一旦最后一个shared_ptr被销毁,对象就被释放,weak_ptr不影响这个过程。
+weak_ptr 是为了解决 shared_ptr 双向引用的问题。