用实例代码理解一下c++11”定义析构函数阻止合成移动”

先普及一下基本知识:

1、移动:int &&a = b;  将b移动给a,会避免一些对象复制,移动之后,b就没有用了。

2、析构:对象释放时,执行的清理函数。

原理很好理解:如果定义了析构函数,则说明清理工作有一些个性化,成员数据如果执行了移动 ,会产生扫尾时,数据已经无效了或继续有效,但操作会影响其他对象。这个时间,会执行拷贝代替移动 。

通过以下代码的差异化,可以感受一下:

1、F2有一个F类型的成员,通过显示定义拷贝和移动,打出日志来查看过程。

2、调用test时,传递参数,执行了一次拷贝,输出new

3、返回值赋值给f3时,执行移动,定义~F2则无法执行移动,执行了拷贝。

class F
{
public:
    F() = default;
    F(const F& f) { cout << "new" << endl; }               //显示定义拷贝构造
    F(const F&& f) { cout << "move" << endl; }             //显示定义移动构造
    F& operator=(const F& f) { cout << "eq" << endl; }
};
class F2
{
public:
    F m_f1;
    ~F2() { }       //加这行,输出2个new,不加输出new和move
};
F2 test(F2 f) { return f; }
int main()
{
    F2 f1;
    F2 &&f3 = test(f1);
    return 0;
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值