Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save wen-long/d7255612e9b3db7caff8 to your computer and use it in GitHub Desktop.
Save wen-long/d7255612e9b3db7caff8 to your computer and use it in GitHub Desktop.

###C++ Primer第5版 学习笔记

####第十三章

  1. 拷贝构造函数可以有自身引用以外的参数,不过必须有默认值
  2. 拷贝构造函数经常被隐式使用,一般不应该是 explicit 的
  3. 调用标准库容器的 insert 和 push 使用拷贝初始化, emplace 使用直接初始化
  4. 赋值运算符应返回左侧对象的引用,且正确处理自赋值
  5. =default显示要求编译器生成合成的函数,=delete将函数定义为删除的函数来阻止该操作
  6. 析构函数不能 =delete
  7. 使用 swap 函数时,如果参数类型定义了自己的 swap 函数,则会使用该成员函数,否则使用 std::swap,因此直接写 swap 而不是 std::swap()
  8. 定义 swap 的类可使用 swap 定义赋值运算符,这叫拷贝并交换.(形参非引用,左值与该副本交换,可以保证异常安全)
  9. 移后源对象处于有效,可析构可被赋值的状态,但不能对其值做任何假设
  10. 使用 move 时,使用 std::move,可以避免潜在的名字冲突
  11. 标准库容器,string,和shared_ptr 既支持移动也支持拷贝,IO 类和 unique_ptr 只可以移动
  12. 容器类为保证 insert,push 等操作异常安全,不会使用没有标明 noexcept的移动构造函数,因此要想让容器类使用,则需根据情况注明
  13. 只有当一个类没有定义任何拷贝控制成员,且类的每个非 static 成员都可以移动时,编译器才会为其合成移动构造函数和运算符
  14. 定义了一个移动构造函数或运算符的类也必须定义自己的拷贝操作,否则会被默认定义为删除的
  15. make_move_iterator将一个普通迭代器转换为移动迭代器,只有当我们确认源对象不再使用时,才能使用其移动迭代器
  16. 同时接受右值和左值的函数一般可重载为const T&T &&
  17. 为了防止对左值赋值,通过引用限定符指出只允许 this 可指向左值或右值,引用限定符需同时出现在声明和定义中,位于声明最后或定义的块语句之前
  18. 如果一个成员函数有引用限定符,同参数列表的所有版本都必须有引用限定符
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment