C++ Primer Chapter 13-4

来源:互联网 发布:面试什么是java线程池 编辑:程序博客网 时间:2024/06/07 10:22
1:关于右值引用左值引用,其实归根结底是保护内存中的数据。

2:move 函数时通知编译器不要调用拷贝构造函数,而调用移动构造函数。

3:移动构造移动赋值 :这些成员函数参数都是一个右值引用类型。

4:对于移动构造函数 和 移动赋值函数,使用 noexpect 来指出不抛出异常。为什么用 noexpect 是因为这和标准库接口有关,如果不用 noexpect 声明,那么编译器会认为该函数可能会抛出异常
         比如 vector 在增长内存时,是可以用移动构造函数的,但是如果我们定义的类中移动构造函数没有申明 noexpect 就会导致编译器不使用移动构造而改用拷贝构造。因为这样可以保证如果出错了,原始数据可以不被破坏!归根结底还是以保护数据第一要素。并且保证标准库的高效率!

5:对于移动构造 和赋值,移动后的源对象我们不可以对其进行值操作,但是我们可以对其进行不依赖值的操作。因为其管理的数据内存被移动另外一个对象中,所以不能进行该类操作。但是可以被赋值,因为可以把其他对象的内存移动该对象中。

6:移动后的源对象一定要保证可析构。

7:合成移动构造函数和移动赋值函数,只会在没有定义任何拷贝复制赋值函数时,且类的每个 非 static 成员可以移动构造时才会生成

8:如果我们有要求编译器生成=default l类型,但是类的成员没有移动构造函数或者移动赋值运算符,而且,那么类就会把移动构造函数移动赋值定义成删除函数。

9:如果我们有要求编译器生成=default l类型,但是类成员为 const 或者是引用 那么移动赋值运算符定义删除函数

10:如果类定义自己的移动构造移动赋值函数,那么合成拷贝构造赋值都会被默认定义为删除的

11:在赋值时,会根据赋值运算符右侧对象类型决定调用何种类型右值则调用移动赋值,左值则运用拷贝赋值

12:如果没有移动赋值构造函数,那么是右值也是调用拷贝复制,或者拷贝赋值
0 0
原创粉丝点击