六一的部落格


关关难过关关过,前路漫漫亦灿灿。



move constructor

拷贝初始化时调用

只接受一个参数, 是自身类类型的右值引用, 或者其他所有参数都有默认值

之所以要求参数为引用: 此时不存在拷贝

接管源对象的资源: 将源对象的资源移动到目的对象

程序员自行保证移后源状态有效, 可正常销毁

如果源对象是右值, 优先匹配移动构造函数, 也可以匹配形参是具有底层const的左值引用的拷贝构造函数


移动构造函数的两种形式

  1. 形参为右值引用

    只使用这个版本

    1T(T &&);
  2. 形参为具有底层const的右值引用

    不会使用该版本: 不能对绑定对象执行写操作, 是不可能接管对象资源的

    1T(const T &&);

承诺移动构造函数不会抛出任何异常

使用noexcept关键字: 参数列表后, 初始值列表之前; 声明和定义时都需要给出

参考StrVec的移动构造函数

  1. 不分配任何新内存, 接管给定StrVec中的内存
  2. 将给定对象中的指针置为nullptr, 保证其状态有效, 可正常析构
1StrVec::StrVec(StrVec &&s) noexcept
2    : elements(s.elements), first_free(s.first_free), cap(s.cap)
3{
4    s.elements = s.first_free = s.cap = nullptr;
5}

如果未告知标准库移动构造函数不会抛出异常, 它将认为移动类对象时存在抛出异常的可能, 并为处理这种可能性做了一些额外工作


移动构造函数


move constructor

拷贝初始化时调用

只接受一个参数, 是自身类类型的右值引用, 或者其他所有参数都有默认值

之所以要求参数为引用: 此时不存在拷贝

接管源对象的资源: 将源对象的资源移动到目的对象

程序员自行保证移后源状态有效, 可正常销毁

如果源对象是右值, 优先匹配移动构造函数, 也可以匹配形参是具有底层const的左值引用的拷贝构造函数


移动构造函数的两种形式

  1. 形参为右值引用

    只使用这个版本

    1T(T &&);
  2. 形参为具有底层const的右值引用

    不会使用该版本: 不能对绑定对象执行写操作, 是不可能接管对象资源的

    1T(const T &&);

承诺移动构造函数不会抛出任何异常

使用noexcept关键字: 参数列表后, 初始值列表之前; 声明和定义时都需要给出

参考StrVec的移动构造函数

  1. 不分配任何新内存, 接管给定StrVec中的内存
  2. 将给定对象中的指针置为nullptr, 保证其状态有效, 可正常析构
1StrVec::StrVec(StrVec &&s) noexcept
2    : elements(s.elements), first_free(s.first_free), cap(s.cap)
3{
4    s.elements = s.first_free = s.cap = nullptr;
5}

如果未告知标准库移动构造函数不会抛出异常, 它将认为移动类对象时存在抛出异常的可能, 并为处理这种可能性做了一些额外工作