`
congfeng02
  • 浏览: 200073 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

为什么operator=操作符返回引用

阅读更多

为什么operator=操作符返回引用

赵湘宁

问题:
MSDN文档中解释到:operator=操作符缺省情况下返回引用——
TYPE& TYPE::operator=(const TYPE&)
为什么呢?我对此的理解是:“=”是个二进制操作符。其传入的参数是引用对象,而其它的参数是类实例,“=”在这个类实例中被重载。而我在实际应用中可以不用返回任何类型(void)来实现赋值操作符,并仍然可以完成赋值操作。我这样做正确吗?如果不正确,那么为什么缺省的实现返回引用呢?
解答:
如果你再花点时间想一想可能就会有答案。其实很简单。operator=返回引用的理由是使你能在一个语句中连接多个赋值。
TYPE a,b,c,d;

a = b = c = d;

编译器是象这样解释前面一行的:

a = (b = (c = d));

在编译过程中,赋值是右结合的。说白了就是如果你想要玩一下多个赋值,operator=返回的东西必须是右(rhs)赋值。除了返回对对象自身的引用还能有什么呢?这就是为什么operator=最后一行总是返回对this的引用:
CMyClass& CMyClass::operator=(const CMyClass& rhs) {
......
// do the
// assignment
return *this;
};

rhs参数被声明为常量的话,就允许常量对象的赋值。没有理由不允许。为什么operator=要返回非常量引用呢?所以不管在哪里你都能使用赋值语句对TYPE进行引用:
void MyFunc(TYPE& a);
...
TYPE a,b;
MyFunc(a=b); // 赋值以后传递

由于operator=返回非常量,你甚至可以使用圆括弧重载通常的等号结合率:
TYPE a,b,c;
(a = b) = c;

图一是简单的示例。并有一个问答题:当你完成并运行FOO时,它的输出是什么?
如果你想要学习更多的关于赋值操作的内容,我强烈推荐一本书《Effective C++》作者是Scott Meyers。本书由Addison Wesley Longman, 1997出版。
分享到:
评论

相关推荐

    为什么operator=操作符返回引用.docx

    以下是对`operator=`操作符返回引用的详细解释: 1. 链式赋值:链式赋值允许我们在一个语句中将多个对象互相赋值,如`a = b = c = d;`。这实际上是在幕后执行`a = (b = (c = d));`。因为赋值是从右向左结合的,`...

    C# 使用技巧之 += 操作符的重载

    首先,`+=`操作符的基本用途是将值类型(如int,double等)或引用类型(如字符串,数组等)的变量与右侧的值相加,然后将结果赋值回左侧的变量。例如: ```csharp int num = 5; num += 3; // 相当于 num = num + 3;...

    operator=赋值检测学习

    这个操作符通常被称为赋值运算符,是C++中的一个重载运算符,允许我们自定义对象如何被赋值。在本学习资源中,你将深入理解`operator=`的用法,并通过一个小程序进行自我检测,以巩固理解和应用。 1. **赋值运算符...

    如何继承“ operator =”

    2. **返回引用**:赋值操作符通常返回一个对左值的引用,以便支持连续赋值(如 a = b = c)。 3. **拷贝构造函数与赋值操作符**:C++中的“Rule of Three”(或“Rule of Five”在C++11及以后版本)指出,如果一个类...

    浅谈C++虚重载操作符 virtual operator= 的使用方法

    2. **返回类型**:虚赋值操作符的返回类型通常是类的引用,以便支持连续赋值(如`a = b = c`)。在这个例子中,`Derived`类有两个版本的`operator=`,一个是不接受基类引用的,返回`Derived&`,另一个是接受基类引用...

    等号操作符使用陷阱实例

    上述代码中,`operator==`重载了等号操作符,使得我们可以像比较基本类型一样比较自定义类的对象。 4. **浅拷贝与深拷贝**:在C++中,当一个对象被赋值给另一个对象(使用`= `操作符),默认情况下是浅拷贝,这...

    实现操作符重载 实现操作符重载

    在C++编程语言中,操作符重载是一种重要的特性,它允许我们为自定义类型定义已有的运算符的行为。操作符重载并不意味着创建新的运算符,而是为现有的运算符赋予新的含义,使得它们可以作用于自定义类型的对象。本文...

    C++ 操作符重载

    3. **返回类型**:操作符重载函数的返回类型不能指定为void,因为操作符总是产生一个结果。 4. **重载的语法**:成员函数重载操作符通常使用"operator关键字+操作符"的方式定义,例如`Complex Complex::operator+...

    简单的理解操作符重载的一个例子

    操作符重载是C++中的一种特性,允许程序员为自定义数据类型定义特定的操作符行为。这个例子展示了如何通过重载操作符`+`、`*`、`+=`和`*=`来使得自定义的`Integer`类支持这些运算。 首先,我们创建了一个名为`...

    C++操作符重载

    在C++编程语言中,操作符重载是一种特殊的功能,允许程序员为已有的运算符赋予新的含义,以便在用户自定义的数据类型上使用。这使得我们可以以自然且直观的方式处理对象,增强了代码的可读性。操作符重载并不创建新...

    C++操作符重载专题

    #### 三、为什么需要操作符重载? 1. **提高代码可读性:**操作符重载使得自定义类型的对象能够使用类似于内置类型的方式来编写代码,例如`a + b`而非`a.add(b)`,这使得代码更加直观易懂。 2. **简化语法:**...

    C++学习教程从零开始(四)-赋值操作符共18页.pdf

    移动赋值操作符(`= operator=`)利用右值引用提供更高效地对象赋值。 6. **拷贝初始化与直接初始化**: 赋值操作符和初始化是两个不同的概念。拷贝初始化(如`T obj = anotherObj;`)涉及赋值操作,而直接初始化...

    c++操作符重载

    操作符重载是C++允许程序员为自定义类型(如类或结构体)重新定义内置操作符的行为的过程。这意味着你可以使自定义类型像内置类型一样使用标准的数学或逻辑操作符。例如,你可以定义一个类`Complex`,并使其能够通过...

    39114_20170620200252_C++操作符重载_

    在C++编程语言中,操作符重载是一种特殊的功能,允许我们为自定义类型赋予与内置类型(如整型或浮点型)相同的操作符含义。通过操作符重载,我们可以使用户定义的类更加直观和易用,因为它能够遵循程序员熟悉的运算...

    C++ 中重载 + 操作符的正确方法

    本文旨在详细介绍如何正确地为用户定义类型重载`+`操作符,并探讨一些关键的设计决策及其背后的原因。 #### 内置操作符的特点 在深入讨论用户定义类型的`+`操作符之前,我们先回顾一下内置类型的`+`操作符具有的几...

    Python中operator模块的操作符使用示例总结

    ### Python中operator模块的操作符使用示例总结 #### 概述 `operator`模块是Python标准库中的一个重要组成部分,它提供了对内置操作符和可调用对象对应的函数版本的支持。这些函数通常比直接使用操作符更快,因为...

    C++ operator两种用法.docx

    这三个操作符将A对象转换为B指针、const B指针和B引用。 当我们使用if语句来判断A对象的值时,编译器将自动调用隐式转换操作符,以便将A对象转换为bool类型。例如: ```cpp A a; if (a) { // do something } ``` ...

    c# 操作符?? null coalescing operator

    `操作符被称为“空合并操作符”(Null Coalescing Operator),它的引入为开发者处理可能为null的值类型或引用类型提供了简洁且直观的方式。这个操作符允许程序员在表达式中优雅地处理null值,避免了冗长的条件检查...

    C重载输入与输出操作符-C教程共5页.pdf.zip

    3. **语法形式**:重载`>>`操作符的语法形式通常是`std::istream& operator>>(std::istream&, T&)`,其中`T`是你的自定义类型,返回值为输入流的引用,以支持链式操作。 二、输出操作符`的重载 1. **左操作数为流*...

Global site tag (gtag.js) - Google Analytics