移动构造函数
2023年12月31日 2023年12月31日
move constructor
拷贝初始化时调用
只接受一个参数, 是自身类类型的右值引用, 或者其他所有参数都有默认值
之所以要求参数为引用: 此时不存在拷贝
接管源对象的资源: 将源对象的资源移动到目的对象
程序员自行保证移后源状态有效, 可正常销毁
如果源对象是右值, 优先匹配移动构造函数, 也可以匹配形参是具有底层const的左值引用的拷贝构造函数
移动构造函数的两种形式
-
形参为右值引用
只使用这个版本
1T(T &&);
-
形参为具有底层const的右值引用
不会使用该版本: 不能对绑定对象执行写操作, 是不可能接管对象资源的
1T(const T &&);
承诺移动构造函数不会抛出任何异常
使用noexcept关键字: 参数列表后, 初始值列表之前; 声明和定义时都需要给出
参考StrVec的移动构造函数
- 不分配任何新内存, 接管给定StrVec中的内存
- 将给定对象中的指针置为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}
如果未告知标准库移动构造函数不会抛出异常, 它将认为移动类对象时存在抛出异常的可能, 并为处理这种可能性做了一些额外工作