C++:移动构造和移动赋值

本文介绍了C++11中引入的移动语义概念,包括移动构造函数和移动赋值操作符。通过示例展示了如何显式声明这些函数来实现资源的有效转移,以及为何在声明了某些特殊成员函数后,需要显式声明所有相关函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动构造和移动赋值

在C++98中,我们自定义的类,会默认生成拷贝赋值操作符函数和拷贝赋值函数以及析构函数;

在C++11中,依赖于新增的move语义,默认生成的函数多了2个移动相关的:移动赋值操作符(moveassignment)和移动构造函数(moveconstructor);

BS建议,如果你显式声明了上述5个函数或操作符中的任何一个,你必须考虑其余的4个,并且显式地定义你需要的操作,或者使用这个操作的默认行为。

一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将不会默认自动生成move操作。

一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将默认自动生成所有的拷贝操作。但是,我们应该尽量避免这种情况的发生,不要依赖于编译器的默认动作。

如果你声明了上述5个默认函数中的任何一个,强烈建议你显式地声明所有这5个默认函数。例如:

  1. template<class T>   
  2. class Handle {   
  3.     T* p;   
  4. public:   
  5.     Handle(T* pp) : p{pp} {}   
  6.        
  7. // 用户定义构造函数: 没有隐式的拷贝和移动操作   
  8.         ~Handle() { delete p; }   
  9.     Handle(Handle&& h) :p{h.p}   
  10.         { h.p=nullptr; };    
  11. // transfer ownership   
  12.     Handle& operator=(Handle&& h)   
  13.         { delete p; p=h.p; h.p=nullptr; }    
  14. // 传递所有权   
  15.     Handle(const Handle&) = delete;     
  16. // 禁用拷贝构造函数   
  17.     Handle& operator=(const Handle&) = delete;   
  18.        
  19. // ...   
  20. };  


FROM: http://www.itatedu.com/news/wa2016032916002955299190.shtml


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值