zoukankan      html  css  js  c++  java
  • 条款11:在operator= 中处理“自我赋值”

    “自我赋值”发生在对象被赋值给自己时:

    class Widget
    {
    	...
    };
    
    Widget w;
    ...
    w = w;  //赋值给自己
    

    operator=,不仅不具备“自我赋值安全性”,也不具备“异常安全性”。

    让operator= 具备“异常安全性”往往自动获得“自我赋值安全性”的回报。因此越来越多的人对“自我赋值”的处理态度是不去管它,而把焦点放在实现“异常安全性”上。

    确保代码不但“异常安全”而且“自我赋值安全”的一个替代方案是,使用所谓的copy and swap技术。此技术和“异常安全性”有密切关系,它是一个常见而够好的operator=撰写办法,其实现方式为:

    class Widget
    {
    public:
        ... void swap(Widget& rhs); //交换*this和任rhs的数据 ... }; Widget& Widget::operator=(const Widget& rhs) { Widget temp(rhs); //为rhs数据制作一份复件(副本) swap(temp); //将*this数据和上述复件的数据交换 return *this; }

    另外一种实现方式为:

     Widget& Widget::operator=(Widget rhs)	//rhs是被传对象的一份复件(副本),注意此处是值传递 pass by value
     {
    	 swap(rhs);		//将*this数据和复件的数据交换
    	 return *this;
     }
    

    上述实现方式因为:1、某类的copy assignment操作符可能被声明为“以by value方式接受实参”;2、以by value方式传递东西会造成一份复件/副本

    此方式牺牲了清晰性,然而将拷贝动作从函数本体移至“函数参数构造阶段”却可令编译器有时生产更高效的代码

    请牢记:

      1、确保当前对象自我赋值时operator= 有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺心、以及copy-and-swap。

      2、确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

  • 相关阅读:
    leetcode--91--递归与动态规划
    Grunt体验
    JSON标准中引号是双引号,不是单引号!
    npm install
    正则-手机号隐藏中间四位及tips备忘
    node tips
    技术栈
    slice与remove
    substr、substring、slice
    springboot 取消post数据大小限制
  • 原文地址:https://www.cnblogs.com/lwenwen/p/3468539.html
Copyright © 2011-2022 走看看