令operator=返回一个reference to *this——条款10

2023-11-05

        关于赋值,有趣的是你可以把它们写成连锁形式:

        int x, y, z;

        x = y = z = 15;

        同样有趣的是,赋值采用右结合律,所以上述连锁赋值被解析为:

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

        这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。

        为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参。这是你为classes实现赋值操作符时应该遵循的协议:

class Widget {
	public:
	...
	Widget& operator=(const Widget& rhs) {
		...
		return *this;
	}
	...
};

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

class Widget {
    public:
    ...
    Widget& operator+=(const Widget& rhs) {
        ...
        return *this;
    }
    Widget& operator=(int rhs) {
        ...
        return *this;
    }
    ...
};

       注意,这只是个协议,并无强制性。如果不遵循它,代码一样可通过编译。然而这份协议被所有内置类型和标准程序库提供的类型如string,vector,complex,tr1::shared_ptr或即将提供的类型(见条款54)共同遵守。因此除非你有一个标新立异的好理由,不然还是随众吧。

请记住:

令赋值操作符返回一个reference to *this;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Effective C++

    条款01 视C 为一个语言联邦 将 视为一个由相关语言组成的联邦而非单一语言 条款02 尽量以const enum inline替换 define define处理与预处理阶段 而非编译阶段 因此此条款也可称为 宁可以编译器替换预处理器比较
  • 考虑写出一个不抛异常的swap函数——条款25

    swap是个有趣的函数 原本它只是STL的一部分 而后成为异常安全性编程 exception safe programing 见条款29 的脊柱 以及用来处理自我赋值可能性 见条款11 的一个常见机制 由于swap如此有用 适当的实现很重要
  • 区分接口继承和实现继承——条款34

    表面上直截了当的public继承概念 经过严密的检查之后 发现它由两部分组成 函数接口 function interfaces 继承和函数实现 function implementations 继承 这两种继承的差异 很像本书导读所讨论的函
  • 确定你的public继承塑模出is-a关系——条款32

    如果你令class D Derived 以public形式继承class B Base 你便是告诉C 编译器 以及你的代码读者 说 每一个类型为D的对象同时也是一个类型为B的对象 反之不成立 你的意识是B比D表现出更一般化的概念 而D比B表
  • 透彻了解inlining的里里外外——条款30

    Inline函数 多棒的点子 它们看起来像函数 动作像函数 比宏好得多 见条款2 可以调用它们又不需要蒙受函数调用所招致的额外开销 你还能要求更多吗 你实际获得的比想到的还多 因为 免除函数调用成本 只是故事的一部分而已 编译器最优化机制通
  • 《Effective C++》学习笔记——区分接口继承和实现继承

    派生类public继承自基类 其中函数均是接口继承 实现继承又分为缺省继承与强制继承 对应着虚函数与非虚函数 我们在做项目时 对于任何事物都要抱有先描述再组织的心态 因此 当描述事物为其构建框架尤其是存在继承 is a 关系时 一定要搞清楚
  • 令operator=返回一个reference to *this——条款10

    关于赋值 有趣的是你可以把它们写成连锁形式 int x y z x y z 15 同样有趣的是 赋值采用右结合律 所以上述连锁赋值被解析为 x y z 15 这里15先被赋值给z 然后其结果 更新后的z 再被赋值给y 然后其结果 更新后的y
  • 尽可能延后变量定义式的出现时间——条款26

    只要你定义了一个变量而其类型带有一个构造函数或析构函数 那么当程序控制流 control flow 到达这个变量定义式时 你便得承受构造成本 当这个变量离开其作用域时 你便得承受析构成本 即使这个变量最终未被使用 仍需耗费这些成本 所以你应
  • 尽量以const、enum、inline替换 #define——条款02

    这个条款或许改为 宁可以编译器替换预处理器 比较好 因为或许 define 不能被视为语言的一部分 一 比如定义一个宏 define ASPECT RATIO 1 653 这个ASPECT RATIO也许从未被编译器看见 也许在编译器开始处
  • 将文件间的编译依存关系降至最低——条款31

    假设你对C 程序的某个class实现文件做了些轻微修改 注意 修改的不是class接口 而是实现 而且只改private成分 然后重新建置这个程序 并预计只花数秒就好 毕竟只有一个class被修改 你按下 Build 按钮或键入make 或
  • Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲 Effective C More Effective C Effective STL 这三本书出版已很多年 后来又出版了Effective Modern C More Effective
  • 《Effective C++》 全书内容提炼总结

    个人博客地址 https cxx001 gitee io 本文阅读说明 孔子云 取乎其上 得乎其中 取乎其中 得乎其下 取乎其下 则无所得矣 对于读书求知而言 这句古训教我们去读好书 最好是好书中的上品 经典书 Effective C 就是
  • Effective C++ 条款十二:复制对象时勿忘其每一个成分

    这句话包含两部分的意思 第一部分是要考虑到所有成员变量 特别是后加入的 相应的拷贝构造函数和赋值运算符要及时更新 第二部分是在存在继承时 不要遗忘基类部分的复制 先看第一部分的意思 举个例子 class SampleClass privat
  • Effective C++ 学习笔记 《六》

    Item 6 Explicitly disallow the use of compiler generated functions you do not want 其实这一节的内容是和item5紧密相连的 上一节的核心围绕着编译器会自动生
  • 将与参数无关的代码抽离templates——条款44

    Templates是节省时间和避免代码重复的一个奇方妙法 不再需要键入20个类似的classes而每一个带有15个成员函数 你只需键入一个class template 留给编译器去具现化那20个你需要的相关classes和300个函数 cl
  • 考虑virtual函数以外的其他选择——条款35

    假设你正在写一个视频游戏软件 你打算为游戏内的人物设计一个继承体系 你的游戏术语暴力砍杀类型 剧中人物被伤害或因其他因素而降低健康状态的情况并不罕见 你因此决定提供一个成员函数healthValue 它会返回一个整数 表示人物的健康程度 由
  • 写了placement new也要写placement delete——条款52

    placement new和placement delete并非C 兽栏中最常见的动物 如果你不熟悉它们 不要感到挫折或忧虑 回忆条款16和17 当你写一个new表达式像这样 Widget pw new Widget 共有两个函数被调用 一
  • 明智而审慎地使用多重继承——条款40

    当多重继承 multiple inheritance MI 进入设计景框 程序有可能从一个以上的base classes继承相同名称 如函数 typedef等等 那会导致较多的歧义机会 例如 class BorrowableItem 图书馆
  • 复制对象时勿忘其每一个成分——条款12

    设计良好之面向对象系统 OO systems 会将对象的内部封装起来 只留两个函数负责对象拷贝 复制 那便是带着适切名称的copy构造函数和copy assignment操作符 我称它们为copying函数 条款5观察到编译器会在必要的时候
  • Effective C++——尽可能使用const

    const允许指定一个语义约束 也就是指定一个 不该被改动 的对象 而编译器会强制实施这项约束 只要保持某个值不变是事实 就应该说出来 以获得编译器的协助 保证不被违反 const与指针 注意const的写法 const char p p可

随机推荐

  • win10关闭自动屏保

    https blog csdn net u010560236 article details 108462946 1 桌面空白处点击鼠标右键 显示设置 电源和睡眠 如下都设置了 从不 然而不起作用 还是会自动锁屏 2 桌面空白处点击鼠标右键
  • java调用dll

    本文转自 http www blog edu cn user4 jjj250 archives 2007 1722308 shtml Jawin Java Win32 是一个免费的 开放源代码的体系结构 用于 Java 组件和通过 Wind
  • eclipse中java代码在控制台输出的中文内容是乱码怎么解决

    eclipse中创建了一个maven工程 用System out在控制台输出内容 但中文内容显示乱码 解决方法 右键单击工程 选择Run As gt Run Configurations 点击Common这个tab页 Encoding选择U
  • 谷歌浏览器如何启用java小脚本_各种浏览器开启JavaScript脚本方法

    随着网站设计技术的发展 为了用户友好体验 大部分网站使用了JavaScript脚本设计 如果您的浏览器禁用或关闭的JavaScript支持 那么可能造成网站体验差或网站部分功能无法使用 下面提供10种浏览器如何开启JavaScript的方法
  • python整数位数能无限大么_在计算机中,整数不能无限大。为什么呢?

    非常感谢邀请 就我个人的浅薄知识回答一下题主的疑问 先简单地回答题主的问题 我猜测题主可能是在学习了C语言之后对 int 类型变量的数值表示范围有限制而产生的疑问 就我的理解 整数不能无限大有两个原因 受限于机器字长与机器中的整数表示方式
  • 2015/4/28总结--git编辑文件---sts创建动态工程

    1 在git 中创建并编辑文件的命令如下 cd touch test txt vi touch test txt 编辑完成时先按Esc退出键 再输入 wq即可保存并退出编辑 2 在spring Tool Suite中创建动态的web 工程
  • muduo net库学习笔记7——用于创建服务器的类TcpServer

    muduo为每个EventLoop设计了runInLoop和queueInLoop函数用来将本该在其他线程执行的线程不安全函数放到它所属线程执行 从而达到线程安全 muduo采用采用one loop per thread的设计思想 即每个线
  • python+opencv分类器训练模型,运动物体识别检测,无人机识别(源码直接下载可用)

    一 简介 使用opencv traincascade 分类器的训练模型包括两个主要阶段 模型的训练阶段和检测阶段 本文档概述了训练自己的弱分类器的级联所需的功能 当前指南将逐步完成所有不同阶段 收集训练数据 准备训练数据并执行实际模型训练
  • Es6基础知识,非常适用前端工作者

    Es6是javascript 的新标准 变量声明 et 1 let声明的关键字和var 声明的基本一致 2 let声明的关键字是局部作用域 只在一对 中启用 3 let声明的变量不会存在变量提升 先把所有变量和函数提升到最前面 变量同意赋值
  • MockMvc测试和spring boot视图开发

    文章目录 导入配置 使用步骤 1 Model准备 2 创建控制器 3 Web测试的支持 视图 JSP 开发 配置文件 编写控制器 环境配置 自定义过滤器 导入配置 pom xml
  • 深度学习中的深度前馈网络简介

    几乎所有的深度学习算法都可以被描述为一个相当简单的配方 特定的数据集 代价函数 优化过程和模型 在大多数情况下 优化算法可以定义为求解代价函数梯度为零的正规方程 我们可以替换独立于其它组件的大多数组件 因此我们能得到很多不同的算法 通常代价
  • unity服务器无响应什么意思,Unity客户端 - 服务器基本问题

    我应该听什么端口 我应该担心的港口 转发 这是一个短语我经常看到卡住的 这是给你的 你可以使用任何你想要的端口 正确的做法是为您的游戏选择约10端口 然后选择1端口作为默认端口 例如 我们从端口10000至10010中选择 让我们将端口10
  • opencv学习历程5 ---- 处理像素点的三种方法

    ConsoleApplication1 cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include
  • 算法基础——大O表示法

    本期主题 算法的大O表示法 目录 1 什么是大O表示法 2 时间复杂度 2 1 时间复杂度定义 2 2 常见算法的时间复杂度 3 数组与链表对比 1 什么是大O表示法 大O表示法是一种特殊的表示方式 指出了算法的速度 指出了最糟情况下的运行
  • 无刷直流风扇PWM调速接线教程(1)

    这是一款服务器使用的大功率无刷轴流风扇 采用的是两个风机级联的方式 提高风压与空气流量 能够快速带走机箱内的热量 正因为如此 这款风扇的功率 转速以及噪音都十分的 暴力 所以有的朋友喜欢称之为 暴力风扇 可以通过图片看到这款风扇的线束有8根
  • 融云出海:两极分化的网红大户「拉美」如何出海制胜

    8 月 17 日 本周四 融云直播课从排查问题到预警风险 社交产品如何更好保障体验 留住用户 欢迎点击报名 处于世界另一端的拉美市场 近些年逐步成为了出海新兴目的地的代表区域 关注 融云全球互联网通信云 了解更多 这里有热衷社媒的网红大国
  • keil5同一个程序编译出来的bin文件大小不一样

    起因 在用一个别人的程序时 出现了设备死机的现象 但是同样的程序别人使用没有问题 经过排查发现生成的bin文件大小和别人的不一样 开始以为是keil和keil编译器的版本不同的问题 但是换成相同的版本还是不行 最后发现是keil配置的优化等
  • FFT算法和DFT算法C语言实现(赋详解)

    声明 本人在校期间主修过 数字信号处理 这门课程 对离散傅里叶变换 DFT 和快速傅里叶变换 FFT 深有了解 现编写了基于C语言的FFT算法 已完成对抽样序列的FFT变换并通过窗口输出 编写思路 由于FFT变换里面含有对虚数的运算 现将输
  • Python函数进阶

    这几天看了下Python函数进阶知识 对于函数中某些的一些高阶用法 如生成器 装饰器 推导式 既然引出了专属装饰器 我们先来谈一谈Python中的闭包 闭包其实就是函数的深层嵌套 你可以理解为一个函数里面套了另一个函数 这样做的目的其实其实
  • 令operator=返回一个reference to *this——条款10

    关于赋值 有趣的是你可以把它们写成连锁形式 int x y z x y z 15 同样有趣的是 赋值采用右结合律 所以上述连锁赋值被解析为 x y z 15 这里15先被赋值给z 然后其结果 更新后的z 再被赋值给y 然后其结果 更新后的y