Item 10:赋值运算符要返回自己的引用 Effective C++笔记

Item 10:Have assignment operators return a reference to *this.

这是关于赋值运算符的编程惯例,用来支持链式的赋值语句:

int x, y, z;
...
x = y = z = 1;

在C++中,它相当于:

x = ( y = ( z = 1 ) );

这是因为=运算符是右结合的,链式赋值时会从右向左运算。链式写法的赋值已经成为了惯例,
所以我们自定义的对象最好也能支持链式的赋值,这需要重载=运算符时返回当前对象的引用:

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

说到运算符的结合性,不妨来研究一下最费解的运算符,的行为。首先,它的返回值是后面表达式的值:

int a;
a = (1, 2, 3);
cout<<a<<endl;

上述代码的输出结果是3。如果你写成了a
= 1, 2, 3
,输出结果将会是1
因为=运算符的优先级高于,,此时第一个表达式变成了a
= 1
,第二个是b,第三个是c
那么结合性呢?,运算符是左结合的:

cout<<1, cout<<2, cout<<3;

输出是:

123


除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/07/28/effective-cpp-10.html

版权声明:本文为博主原创文章,转载请附上原文链接。

时间: 2024-12-31 21:32:54

Item 10:赋值运算符要返回自己的引用 Effective C++笔记的相关文章

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

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:令赋值(assignment)操作符返回一个reference to *this --> 这样可以实现级联赋值 示例: #include <iostream> #include <string> using namespace std; class Widget{ public: Widget(int v):value(v){} Widget& opera

Item 21:需要返回对象时,不要返回引用 Effective C++笔记

Item 21: Don't try to return a reference when you must return an object Item 20中提到,多数情况下传引用比传值更好.追求这一点是好的,但千万别返回空的引用或指针. 一个典型的场景如下: class Rational{ int n, d; public: Raitonal(int numerator=0, int denominator=1); }; // 返回值为什么是const请参考Item 3 friend con

Item 39:明智地使用private继承 Effective C++笔记

www.mafengwo.cn/event/event.php?iid=4886087www.mafengwo.cn/event/event.php?iid=4886106www.mafengwo.cn/event/event.php?iid=4886060www.mafengwo.cn/event/event.php?iid=4885815www.mafengwo.cn/event/event.php?iid=4886125www.mafengwo.cn/event/event.php?iid

C++11函数返回右值引用

我们定义了一个可以传入右值引用的构造函数的类B,在使用std::move的时候,我们非常容易犯一个错误.看下面的代码: class B { public: B() :s(10), ptr(new int[s]) { std::cout << "default constructor" << std::endl; for (int i = 0; i < s; i++) { ptr[i] = i; } } B(const B& b) :s(b.s) {

《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)

/* 返回数组的引用(返回数组的指针,方法与之相同) 共四种方法(在下面示例程序中,调用其中一种方法时,需要将其他三种方法注释掉)*/ 1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 #include <iostream> 4 #include <stdexcept> 5 #include <ctype.h> 6 #include <locale> 7 #include <iterator>

实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()函数)

当函数返回字符串的时候,我们可以定义返回string和string&. 1写一个返回string引用的函数 std::string & TestStringReference() { std::string loal_str = "holy shit"; return loal_str; } 这个函数当然是错误的,编译器会提示我们: 返回局部变量或临时变量的地址: loal_str 即不能返回局部变量的引用. 2写一个返回string的函数(函数返回局部变量string

为什么赋值操作符函数的参数为const引用,返回值为引用

为什么赋值操作符函数的参数为const引用,返回值为引用 1.返回值类型 返回类型一般声明为类型的引用,并在函数结尾时返回实例自身的引用(即*this).这里主要有两个原因:(1)返回引用可以减少一次拷贝构造和析构函数导致不必要的开销,因为返回值类型不是引用,会创建一个匿名对象,这个匿名对象时个右值,获取return的值.(2)可以实现连续赋值 在例子中 b=c=a; 返回值不是引用类型也是可以的,其运算顺序 b=(c=a); c得到一个右值,再将右值赋给b,所以逻辑上没有问题的.但是如果是 (

C++返回局部变量的引用的问题

结论: (1)不能返回局部变量的引用给一个引用变量. (2)但是如果返回引用给一个相关的非引用变量的话是可以的. 原因如下: 问题一: 返回一个局部变量的引用.如: int& ABC() { int n = 5; return n; } void main() { int x; x=ABC(); cout<<x<<endl; } 为什么这里能接收到 返回局部变量的引用呢?局部变量n没有被销毁吗? 解释: (1) 所谓不能返回局部变量,是指局部变量在栈空间中分配内存,函数返回

C++返回值的引用与非引用

转自: https://blog.csdn.net/qq_22660775/article/details/89854545 返回引用与返回非引用的区别: 返回引用时,函数内部不会构造一个临时变量,而是直接将返回值返回出去.而当为非引用时,会构造一个临时变量(但不一定),然后返回这个匿名的临时变量. 举例: class B { public: B(){ cout << "B的构造函数" << endl; } B(int i){ cout << &qu