[翻译] Effective C++, 3rd Edition, Item 10: 让 assignment operators(赋值运算符)返回一个 reference to *this(引向 *this 的引用)

神器 git clean 使用神器git clean解决中间文件 阅读详情

Item 10: 让 assignment operators(赋值运算符)返回一个 reference to *this(引向 *this 的引用)

作者:Scott Meyers

译者:fatalerror99 (iTePub's Nirvana)

发布:http://blog.youkuaiyun.com/fatalerror99/

关于 assignments(赋值)的一件有意思的事情是你可以把它们穿成一串:

int x, y, z;

x = y = z = 15;                        // chain of assignments

另一件有意思的事情是 assignment(赋值)是 right-associative(右结合)的,所以,上面的赋值串可以解析成这样:

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

这里,15 赋给 z,然后将这个 assignment(赋值)的结果(最新的 z)赋给 y,然后将这个 assignment(赋值)的结果(最新的 y)赋给 x。

这里的实现方法是让 assignment(赋值)返回一个 reference to its left-hand argument(引向它的左侧参数的引用),而且这就是当你为你的 classes(类)实现 assignment operators(赋值运算符)时应该遵守的惯例:

class Widget {
public:
  ...
Widget& operator=(const Widget& rhs)   // return type is a reference to
{                                      // the current class
  ...
  return *this;                        // return the left-hand object
  }
  ...
};

这个惯例适用于所有的 assignment operators(赋值运算符),而不仅仅是上面那样的标准形式。因此:

class Widget {
public:
  ...
  Widget& operator+=(const Widget& rhs   // the convention applies to
  {                                      // +=, -=, *=, etc.
   ...
   return *this;
  }
   Widget& operator=(int rhs)            // it applies even if the
   {                                     // operator's parameter type
      ...                                // is unconventional
      return *this;
   }
   ...
};

这仅仅是一个惯例,不遵从它的代码也能通过编译。然而,这个惯例被所有的 built-in types(内建类型)和标准库中(或者即将进入标准库——参见 Item 54)的 types(类型)(例如,string,vector,complex,tr1::shared_ptr 等)所遵从。除非你有好的做不同事情理由,否则,不要破坏它。

Things to Remember

  • 让 assignment operators(赋值运算符)返回一个 reference to *this(引向 *this 的引用)。
C++ STL编译报错:error: error passing 'const' as 'this' argument 用C++ STL(标准模板库)编写仿函数的时候,编译报错: error: passing 'const FindNameOrAddress' as 'this' argument of 'bool FindNameOrAddress::operator()(std::string, std::string)' discards qualifiers [-fpermissive] 其中:Find... 阅读详情

相关推荐

FANUC机器人电弧跟踪功能深度解析:从电流采样原理到ROBOGUIDE仿真避坑指南

本文深度解析FANUC机器人电弧跟踪技术,从电流采样原理到ROBOGUIDE仿真避坑指南,详细介绍了电流波形分析、实时补偿机制及现场调试技巧。针对工业焊接中的常见问题,提供从底层原理到高阶应用的解决方案,帮助工程师优化自动化焊接质量。

weixin_31785177的博客 553

git- 仓库创建、修改、提交、撤销

1.仓库创建 zhangshuli@zhangshuli-MS-7817:~$ mkdir myGit zhangshuli@zhangshuli-MS-7817:~$ cd myGit/ zhangshuli@zhangshuli-MS-7817:~/myGit$ git init Initialized empty Git repository in /home/zhangshul...

weixin_30376163的博客 563

FreeRTOS-Plus-CLI使用笔记

FreeRTOS-Plus-CLI使用笔记 一、简介 详细介绍可参考FreeRTOS-Plus-CLI官网地址入口 FreeRTOS+CLI(Command Line Interface, 命令行接口)提供了一种简单、小型、可扩展且RAM高效的方法,使FreeRTOS应用程序能够处理命令行输入。添加一条指令的步骤如下: 提供一个实现命令功能的函数 将命令映射到该功能函数 注册命令 运行命令解释器 命令行调试接口对于排查分析出现的问题提供了很好的接口,可以通过查看传感器信息判断传感器是否正常,可以查看内置

ApexYuan 6964

个人常用Git操作记录

本地分支与远程分支建立联系 Git - 新建本地分支与远程分支关联问题 查看本地分支与远程分支关系: git branch -vv 当前分支与远程分支建立关系: git branch --set-upstream-to=origin/<origin> 停止追踪已经记录的文件 git停止追踪文件-最佳实践 正常情况下 git rm -r --cached .idea...

weixin_30639719的博客 510

【软件逆向】带壳带反调试找flag教程(VMProtect3.0+X64dbg+ScyllaHide)

【软件逆向】带壳带反调试找flag教程(VMProtect 3.0+X64dbg+ScyllaHide)

zhangjiuding的博客 7513

1976国际标准大气_Matlab

输入高度,计算空气密度、气压、温度、声速 function [airDens,airPress,temp,soundSpeed]=Atmos(geomAlt) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1976 U.S Standard Atmosphere Interpolation % % Note: Function does not extr.

JISANSAN的博客 1万+

git 命令的使用(一)

首先介绍一个简单可用的查看git命令帮助的方法。 git环境安装好以后,在命令行下,$ git help COMMAND例如,查看git add的使用方法$ git help add下面再介绍一下git clean命令的使用。 git clean命令用于删除git库没有跟踪的文件(untracked files)。 经常使用的参数有: ‘-f’强制删除,要删除文件,必须有选项; ‘-d’删除目

翔云 1489

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8891

【git教程】git clean 命令讲解

本文详细介绍了Git的git clean命令,用于清理工作区未跟踪的文件。

优快云_RTKLIB的博客 2202

【HSPiP应用指南】从理论到实践:如何利用汉森溶解度参数优化配方设计

本文深入解析了汉森溶解度参数(HSP)理论及其在配方设计中的核心价值,并详细介绍了如何利用HSPiP软件工具从理论走向实践。文章通过匹配溶解度参数、计算汉森距离(Ra),系统阐述了如何解决溶剂选择、颜料分散稳定性及扩散行为预测等关键问题,并结合界面气相色谱(IGC)等实验方法提升预测精度,旨在帮助配方师实现配方设计的可视化、可量化与高效优化。

weixin_29305313的博客 1650

SAP PCC成本收集器实战:从配置到结算的完整流程解析

本文详细解析了SAP PCC成本收集器从配置到结算的完整流程,特别适用于重复制造行业。通过实战案例和配置要点,帮助用户掌握物料分类账管理、成本中心费用归集及差异分析等核心功能,提升企业生产成本控制效率。

weixin_29251567的博客 896

passing ‘const *’ as ‘this’ argument of ‘*’ discards qualifiers

 以前也一直用const 引用作为参数传递,但是在有一次遇到了问题,懵了,为啥之前没遇到呢?查了资料才发现,以前自己都没写过类,都是各个函数调用没有问题,但是这次遇到问题是类内的成员函数之间的,和之前自己写的不同。这时候就不能想const就const了,要考虑的还挺多。需要铭记!!! 如题: #include&lt;iostream&gt; using namespace std; clas...

https://github.com/heatMa 1万+

abaqus应力值导出并进行后处理(同一节点多个应力值如何处理?)

Abaqus应力导出: ‘Tools’--- Probe values 在Probe Values里面可以选择需要导出的信息,比如‘Nodes’或者‘Elements’ 如果需要导出多个应力值或者其他信息可以选择‘Components’这个选项。 选择‘Selected’只输出一个正应力S33(对应截图中的) 如果是‘All Direct’,则是输出6个正应力S11, S22, S33, S12, S13, S23 ‘All Principals’输出三个正应力 在输出...

themingyi的博客 5万+

Effective c++学习笔记——条款10:令operator=返回一个*this的引用

Have assignment operators return a reference to *this 从题目,我们就要记住这条信息,让你的operator=函数return *this; 基本类型int、char等都提供了连锁赋值,并采用右结合律。 int x, y, z; x = y = z = 15; 这句真正被解析为:x = (y = (z = 15)); 为了实现连锁赋值,...

kanwoerzi 186

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

连锁赋值

不积跬步无以至千里 606

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

git pull简介

本文整理自: http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-pull.html  http://www.cnblogs.com/lbsx/archive/2010/10/16/1853193.html  在git中,我们可以通过git pull命令把服务器仓库的更新拉到本地仓库中

Robin Hu的专栏 8万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android系统启动——4 zyogte进程 (C篇)

https://cloud.tencent.com/developer/article/1199508 本篇文章的主要内容如下: 1、为什么要研究 zygote? 2、Zygote进程(C层)的启动 3、关于虚拟机简介 4、启动虚拟机 5、Runtime 我们大家都是知道"一鼎三足"和"三角形的稳定性",那么支撑Android系统的三个"足"是什么?即init进程、SystemServ...

922

C++笔记 10:令operator=返回一个reference to *this

Effective C++笔记 Have assignment operators return a reference to *this 总结

qq_36333986的博客 158

EffectiveC++ 条款10:令operator=返回一个reference to *this

LIJIWEI0611的博客 158

Effective C++ 10 令operator=返回一个reference to *this 笔记

关于赋值,有趣的是你可以把它们写成连锁形式:1intx,y,z;2x=y=z=15;//赋值连锁形式 同样有趣的是,赋值采用右结合律,所以上述连锁赋值被解析为:1x=(y=(z=15)); 这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。 为了实现“连锁赋值”,赋值操作符必...

weixin_34378045的博客 134

Effective C++读书笔记之十:令operator=返回一个reference to *this

Item 10:Have assigment operators

极客时代 704

迷宫小车汇编语言

又到了一年一度的课程设计的时间了,作为计算机学院的一员,写迷宫已经成为了大二学生的必经之路。如果此时的你还很迷茫,不知道从何处动手,那么,你一定要给我点赞了,因为当时的我和你一样,也是这样,天天都在百度,还是不懂要干嘛,感觉已经走进了迷宫无法自拔。不过,只要你态度端正,好好更着老师的节奏走,绝对不 会挂的,加油 ...

study_way的博客 683

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

Have assignment operators return a reference to *this. 关于赋值,有趣的是你可以把它们写成连锁形式: int x, y, z; x = y = z = 15; 同样有趣的是,赋值采用右结合律,所有上述连锁赋值被解析为: x = (y = (z = 15)); 这里15先被赋值给z,然后其结果再被赋值给y,然后其结果再被...

qu1993的博客 225

[翻译] Effective C++, 3rd Edition, Item 11: 在 operator= 中处理 assignment to self(自赋值)

Item 11: 在 operator= 中处理 assignment to self(自赋值)作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.csdn.net/fatalerror99/当一个 object(对象)赋值给自己的时候就发生了一次 assignment to self(自赋值):

艺术编程 5182

operator=返回一个reference to *this

在C++中,调用拷贝构造函数有三种情况: 1.一个对象作为函数参数,以值传递的方式传入函数体. 2.一个对象作为函数返回值,以值传递的方式从函数返回. 3.一个对象用于给另外一个对象进行初始化(复制初始化). 拷贝构造函数必须以引用的形式传递(参数为引用值).其原因如下: 当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的调用来生成函数中的对象. 这样

路在脚下 619
上一篇: [翻译] Effective C++, 3rd Edition, Item 9: 绝不要在 construction(构造)或 destruction(析构)期间调用 virtual functions(虚拟函数)
下一篇: [翻译] Effective C++, 3rd Edition, Item 11: 在 operator= 中处理 assignment to self(自赋值)
fatalerror99
博客等级 码龄24年 166粉丝 20原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值