c++ 默认移动构造函数什么时候会自动生成以及它内部实现

一、默认移动构造函数什么时候会自动生成?

如果需要用一个右值去拷贝构造一个类对象或赋值给一个类对象,则在该类自定义了移动构造函数/移动赋值函数的情况下,会调用该类自定义的移动构造函数/移动赋值函数

而在没有自定义移动构造函数/移动赋值函数的情况下,如果该类自定义了拷贝构造函数/赋值运算符或析构函数之一,都只会调用拷贝构造函数/赋值运算符(前提是形参为const T&而不是T&,因为const T&可以兼容右值实参,而T&不能)而不会生成默认移动构造函数。注意即使没有自定义拷贝构造函数/赋值运算符,只自定义了析构函数,也不会生成默认移动构造函数,这是因为自定义析构函数表明该类在析构时可能需要回收内存,如果生成了默认移动构造函数可能会出错(比如同一地址被释放两次的错误)

二、默认移动构造函数内部实现

当成员类型有移动构造函数时,会调用该成员的移动构造函数,否则调用默认拷贝构造函数。

#include<iostream>
#include<memory>
#include<string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class A
{
public:
	int *p = new int;
	string str = "Hello";
};

int main()
{
	A a;
	A b(std::move(a));  //std::move语句可以将左值变为右值而避免拷贝构造。该语句使用默认移动构造函数构造
	cout << a.p << " " << a.str << " "<<endl; //0xfb2650
	cout << b.p << " "<<b.str << " "<<endl;  //0xfb2650 Hello
}

在a的资源转移给b后,a.p并没有变成nullptr,a.str变成了空串。这是因为默认移动构造函数对int*类型成员只进行简单复制,对于string类型成员调用了其默认移动构造函数进行真正的移动

参考:

c++ 默认移动构造函数_杳杳星河的博客-CSDN博客

C++默认移动构造函数有什么用? - 知乎 (zhihu.com)

详解C++移动语义std::move()_子木呀的博客-CSDN博客

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值