EffectiveC读书笔记15让operator返回this的引用
前言:
C++的设计者 Bjarne Stroustrup 下了很大功夫想使用户自定义类型尽可能地和固定类型的工作方式相似。这就是为什么我们可以重载运算符,写类型转换函数,控制赋值和拷贝构造函数,等等。他做了这么多努力,我们也该继续做下去。 基本数据类型的赋值操作可以象下面这样链起来int w, x, y, z; w = x = y = z = 0;所以,你也应该可以将用户自定义类型的赋值操作链起来:string w, x, y, z; // string 是由标准 C++库 "自定义"的类型 w = x = y = z = "Hello";
因为赋值运算符的结合性天生就是由右向左,所以上面的赋值可以解析为: w = (x = (y = (z = "Hello")));
很值得把它写成一个完全等价的函数形式。 w.operator=(x.operator=(y.operator=(z.operator=("Hello"))));
这个格式在此很具有说明性,因为它强调了 w.operator=, x.operator=和 y.operator=的参数是前一个 operator=调用的返回值。在一个类 C中,缺省版本的 operator=函数应具有如下形式(见条款 45):C& C::operator=(const C&);
一般情况下几乎总要遵循 operator=输入和返回的都是类对象引用的原则。例如,标准
string 类型提供了两个不同版本的赋值运算符:string& operator=(const string& rhs); // 将一个 string 赋给一个 string string& operator=(const char *rhs); // 将一个 char* 赋给一个 string //2cyhs返回值是自身引用的目的是支持链式编程
采用缺省形式定义的赋值运算符里,对象返回值有两个很明显的候选者:看看下面哪一个是正确的?以String 类为例:String& String::operator=(const String& rhs) { ... return *this; // 返回左边的对象 } String& String::operator=(const String& rhs) { ... return rhs; // 返回右边的对象 }
首先,返回 rhs 的那个不会通过编译,因为 rhs 是一个 const String 的引用,而operator=要返回的是一个 String 的引用。但这个问题很容易解决——只用象这样重新声明operator=:String& String::operator=(String& rhs) { ... }
但这样的话,调用它的应用程序就不能通过编译了!为什么?x = "Hello"; // 和 x.op=("Hello");相同
因为赋值语句的右边参数不是正确的类型——它是一个字符数组,不是String——编译器就要产生一个临时的 String 对象(通过 Stirng 构造函数— —参见条款 M19)使得函数继续运行。就是说,编译器必须产生大致像下面这样的代码:const String temp("Hello"); // 产生临时 String x = temp; // 临时 String 传给 operator=
编译器一般会产生这样的临时值,但注意临时值是一个 const 。这很重要,因为它可以防止传递到函数内的临时值被修改。否则,程序员就会很奇怪地发现,只有编译器产生的临时值可以修改,而他们在函数调用时实际传进去的参数却不行。(早期版本的 C++允许这类的临时值可以被产生,传递,修改, 结果很多程序员感到很奇怪)
现在我们知道应用程序就不能通过编译的原因了:编译器生成的temp是const 对象,参数却是非const类型的。
所以,结论是,这种情况下你将别无选择:当定义自己的赋值运算符时, 必须返回赋值运算符左边参数的引用,*this。
餐厅如何选择购买自动洗碗机?在食堂和餐厅使用自动洗碗机可以提高洗碗的效率,降低洗碗的劳动强度。餐厅如何选择购买自动洗碗机?首先,这取决于洗碗机是如何清洗的。清洗方法与清洗效率和质量有关。在餐具的洗涤方法上,喷
餐厅如何选择购买自动洗碗机?在食堂和餐馆使用自动洗碗机可以提高洗碗效率,降低洗碗的劳动强度。餐厅如何选择购买自动洗碗机?首先,这取决于洗碗机的清洁方式。清洗方法关系到清洗效率和质量。在餐具的清洗方法上,喷淋洗
学校餐厅如何选择洗碗机?目前很多餐厅学校(大学幼儿园)的食堂娱乐场所的厨房等仍然是人工洗碗,而每天清洗餐具的量是几百甚至几万件。如何根据就餐人数合理选择商用洗碗机,解决招聘难人工成本高资源浪费的问题?n洗
超声波清洗机的工作原理全自动超声波清洗机的原理主要是将换能器转换为功率超声波频率源的声能,并将其转换为机械振动,使槽内清洗液通过清洗壁向超声波辐射。由于超声波的辐射,槽内液体中的微气泡在声波的作用下能够
餐厅洗碗机的优势在哪?随着互联网的发展,餐饮业的大多数餐具也有标准的洗涤方案。如何有效节约劳动力成本?小编向您介绍了餐厅洗碗机的优点,它有效地替代了大量的劳动力成本!接下来,小编将从五个方面向大家展示商
揭盖式洗碗机的工作原理揭盖式洗碗机是普通商用洗碗机中较便宜较为简单的洗碗机。特别适用于小型餐厅酒店酒吧等洗涤量小的服务行业。揭盖式洗碗机的工作原理是,程序控制器内的开关触点按照程序设定的要求依次闭合或断
ampampquot我的tempo我做主ampampquot的欧扎克针不戳品牌V计划人和企业的发展都有自己的节奏,掌控好自身的发展不可能跟别人去比节奏,不能跟别人比效果。欧扎克CMO李高杨以下是采访实录记者欧扎克出圈的原因是什么?李高杨其实所谓出圈,只是因为消费者
青3还没播完,爱奇艺又开始筹备青4了?要说最近最火爆的综艺节目,毫无疑问就是抢占了100多个热搜的选秀节目创造营2021和青春有你3。爱奇艺与腾讯视频从一开始的宣发到开播时间,两档节目的明争暗斗明眼人都能看出来。而具体
干货!什么是无主商标?无主商标等于闲置商标吗?什么是无主商标?无主商标是指由于企业破产解散关闭或商标人死亡,在主管机关的商标注册簿内仍然存在的注册商标。简而言之,无主商标就是没有商标持有人但仍合法的商标。无主商标有什么特征呢?
吉利起诉曹操货的,获赔10。1万元日前,浙江吉利控股集团有限公司与北京搜狐互联网信息服务有限公司等侵害商标权及不正当竞争纠纷一审民事判决书于近日公布,原告为浙江吉利控股集团有限公司,被告为深圳市曹操货的科技有限公司
如何注册个人肖像为商标?会被驳回吗?能够作为商标注册的标志,除了文字图形数字等,自己的肖像也可以为商标申请注册。在生活中,我们也能看到很多以肖像注册为商标的,比如老干妈肯德基王守义等都是知名度比较高的肖像商标。而且随