C++ Primer Chapter 13-5

来源:互联网 发布:面试什么是java线程池 编辑:程序博客网 时间:2024/06/07 07:29
1:我们可以用一个赋值运算符实现移动 和 拷贝赋值(前提是定义移动构造函数)
  1. foo & =operator(foo rhs)
在这里,如果 = 运算符右侧对象是左值,那么由于会向 rhs 传递对象,那么会调用拷贝构造函数构造 rhs ,如果右侧对象是右值,那么会调用移动构造函数。

2:一当一个类定义任何一个拷贝操作,就应该定义所有五个操作(拷贝构造,拷贝赋值,移动构造,移动赋值,析构)

3:在调用
  1. std:move(value)
之后,value 的值是未定义的,但是却又是有效的,为了保障程序不出问题,我们必须保证 执行该函数后,value 不能被访问(取值)。

4:移动迭代器
  1. iter1 = make_move_iterator(iter)
利用这个函数可以把一个迭代器改成移动迭代器,就是把 iter 指向的内存元素变成可以移动的,对 iter1 解引用就可以得到类似 move(value)的操作。可以移动 *iter1 元素。但是我们必须保证移动后,我们不能访问 *iter ,因为原来元素移动后值未定义,但却是有效的,如果访问会使得程序出问题

5:建议不要随便使用移动操作,因为有一个移动后的元素他的状态具有不确定性,调用 std::move 一定要保证移动后的源不能被访问

6:const T &  T &&
一般成员函数参数 const T & ,一般为左值,为了保证复制对象安全性,不用 T &,参数类型时 T &&  ,参数一般是右值引用,一般是为了窃取数据,是需要修改窃取后的数据的,不用 const T &&。

7:左值和右值引用成员函数
我们可以像 用 const 一样来用 & 和 && 来修饰一个 this 指针可以指向一个左值或者右值引用限定符只能用于非 static 成员函数,引用限定符可以和 const 一起用,但是必须在 const 后面

8:用 & 修饰函数只能用于左值, && 修饰函数只能用于右值

9:引用限定符也是可以像 const 一样,可以区分重载函数有无引用限定符是可以区分函数的类型。但是类似于成员函数参数的 const T& 和 T&& 一样,类型限定符可以为 const & 和 && ,前面一种可以用于任何对象后面一种只可以用于右值类型

10:如果一个类中有两个或者以上名字、参数、都相同的成员函数,那么这些函数中只要有一个函数有引用限定符说明,那么所有其他同名同参数的函数要有,对于同名但是不同参数的则没有该要求

11:foo(*this) 是一种 无主 的右值foo 是类名
0 0
原创粉丝点击