关于赋值,可以写成连锁形式:

int x, y, z;
x = y = z = 15; //赋值连锁形式

赋值采用右结合律,故上述赋值被解析为:

x = (y = (z = 15));

为了实现连锁赋值,赋值操作符必须返回一个reference引用指向操作符的左侧实参。

下面示例是为classes实现赋值操作符时应该遵循的协议:

class Widget
{
public:
...
Widget& operator=(const Widget& rhs) //返回类型是个reference,指向当前对象
{
...
return *this; //返回左侧对象
}
...
};

这个协议不仅适用于以上的标准赋值形式,也适用于所有赋值相关运算,例如:

class Widget
{
public:
...
//这个协议适用于+=,-=,*=,等等
Widget& operator+=(const Widget& rhs) //返回类型是个reference,指向当前对象
{
...
return *this;
}
Widget& operator=(int rhs) //此函数也适用,即使此操作符的参数类型不符合协定
{
...
return *this;
}
...
};

这份协议被所有内置类型和标准程序库提供的类型如string,vector,complex,trl::shared_ptr或即将提供的类型共同遵守。

请牢记:

  令赋值(assignment)操作符返回一个reference to *this

条款10:令operator= 返回一个reference to *this的更多相关文章

  1. Effective C++ -----条款10: 令operator=返回一个reference to *this

    比如: Widget& operator=(const Widget& rhs) { ... return* this; } 令赋值(assignment)操作符返回一个referen ...

  2. 【10】令operator=返回一个reference to *this

    1.令operator= 返回一个reference to *this,为什么? 这只是一个协议,并无强制性.但是,为了与基本类型的行为保持一致性,强烈建议这么做.设计class 有一个宝典:一旦有疑 ...

  3. Effective C++ 条款10:令operator= 返回一个reference to *this

    class Widget { public: ... Widget& operator+=(const Widget& rhs) // 返回类型是个reference,指向当前对象 { ...

  4. 条款10:令operator=返回一个reference to * this(Have assignment operators return a reference to *this)

    NOTE: 1.令赋值(assignment)操作符返回一个reference to *this. 2.此协议适用于所有赋值相关的运算比如:+= -= *=....

  5. Effective C++ 条款九、十 绝不在构造和析构过程中调用virtual函数|令operator=返回一个reference to *this

      1.当在一个子类当中调用构造函数,其父类构造函数肯定先被调用.如果此时父类构造函数中有一个virtual函数,子类当中也有,肯定执行父类当中的virtual函数,而此时子类当中的成员变量并未被初始 ...

  6. NO.9: 令operator=返回一个reference to *this

    1.令赋值操作返回一个reference to *this(除非你有个标新立异的理由,那就随大众- - )

  7. 条款10:让operator=返回一个reference to *this

    例如对象x,y,z.要实现连锁赋值(假设operator=已经重载过了):x = y = z,那么operator=则必须返回一个*this. 注意这个条款不仅仅适合于operator=,对于oper ...

  8. 条款10:令operator=返回一个*this的引用

    为了编程的简洁性,有时候需要串联赋值,如:x = y = z = 15; 由于赋值采用右结合,因此上述语句被解释为:x = (y = (z = 15)); 为了实现串联赋值,复制操作符函数必须返回一个 ...

  9. 令assignment操作符返回一个reference to *this

    [令assignment操作符返回一个reference to *this] 关于赋值,可以把它们写成连锁形式: int x, y, z; x =y =z =15; II赋值连锁形式 上述连锁赋值被解 ...

随机推荐

  1. FreeBSD 内核中的SYSINIT分析【转】

    FreeBSD kernel是一个膨大的系统, 对于这样一个大系统, 里面往往包含了大量的子系统和  模块,当系统初始化时这些模块就需要初始化, 按照通常的思路,这些初始化过程必须在某处  被显式地调 ...

  2. git命令评测

    近日得知git命令在库进行操作,查找git尽管小命令(当然,也不能太小),但他们是一个非常强大的组合,更重要的是,它是非常的效果不同状态的命令是不一样的打.该博文总结git命令.. Git命令 命令小 ...

  3. C#7

    C#7 阅读目录 out变量 元组(Tuples) 模式匹配(Pattern matching) 本地引用和返回(Ref locals and returns) 本地函数(Local function ...

  4. jQuery分离构造器

    http://www.imooc.com/code/3401 通过new操作符构建一个对象,一般经过四步: A.创建一个新对象   B.将构造函数的作用域赋给新对象(所以this就指向了这个新对象) ...

  5. Android Studio:Grade 全局参数定义

    Grade 全局参数定义 实际开发中设置公共的编译依赖参数等. 方法一: 在项目外层的build.gradle文件中定义,格式如下: 文件名:build.gradle ext { sourceComp ...

  6. Python: 文件操作与数据读取

    文件及目录操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块,主要用到的几个函数是, import os 返回指定目录下的所有文件和目录名: os.listdir() 重命名: ...

  7. Linux性能测试 dmesg命令

    dmesg 命令主要用来显示内核信息.使用 dmesg 可以有效诊断机器硬件故障或者添加硬件出现的问题.  另外,使用 dmesg 可以确定您的服务器安装了那些硬件.每次系统重启,系统都会检查所有硬件 ...

  8. BS学习概述

    从最初的牛腩新闻公布系统,到如今的JS,回想一下,自己的BS也算是学了大半,可是有时候想起来还是总是有一种不踏实的感觉,一是由于从开学到如今赶上了三级考试,自考.软考,导致BS学习时间被大大压缩了,代 ...

  9. thinkphp3.2定义多模块并设置默认模块

    前台入口文件index.php <?php // +---------------------------------------------------------------------- ...

  10. 如何导入以前的qq聊天记录

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在新版的qq2013已经可以设置聊天记录的保存路径,但是如何把以前的聊天记录都导入进来呢?今天找到了办法.首先把原来q ...