c++ primer(第5版) 学习笔记

第四章

*头文件的代码一般不应该使用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 双向引用的问题

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值