C++ 赋值函数为什么返回reference to *this?

赋值操作为什么要返回 reference to *this? 要弄清这个问题之前,先了解函数的返回值类型:返回值类型,返回引用类型

  • 返回值类型:返回的是一个对象的副本。
  1. test operator= (const test &t)
  2. {
  3. ...
  4. cout << "赋值" << endl;
  5. return *this;
  6. }

当程序中出现test对象之间的赋值操作时, 调用 operator函数。当return *this的时候,会执行拷贝构造test(const test&t),此时的入参为*this(即调用该operator= 函数的对象),返回的对象由*this构造而成。

  • 返回引用类型:返回的是对象本身。
  1. test &operator= (const test &t)
  2. {
  3. ...
  4. cout << "赋值" << endl;
  5. return *this;
  6. }

和上面一样,当程序中出现test对象之间的赋值操作时,会执行operator=操作,当return *this的时候,返回的是调用该赋值操作对象的本身。

effective C++中说,是为了实现连锁赋值如a = b =c;下面下一个例子,测试一下,如果不返回引用,就不能实现连锁赋值了吗?

  1. class test
  2. {
  3. public:
  4. test() :i(10)
  5. {
  6. cout << "构造" << endl;
  7. }
  8. ~test()
  9. {
  10. }
  11. test(const test &t)
  12. {
  13. this->i = t.i;
  14. cout << "拷贝" << endl;
  15. }
  16. test operator= (const test &t)
  17. {
  18. i = t.i;
  19. cout << "赋值" << endl;
  20. return *this;
  21. }
  22. void setData(int value)
  23. {
  24. i = value;
  25. }
  26. int getData()
  27. {
  28. return i;
  29. }
  30. private:
  31. int i;
  32. };
  33. int _tmain(int argc, _TCHAR* argv[])
  34. {
  35. test a;
  36. test b;
  37. test c;
  38. cout << a.getData() << endl << b.getData() << endl<<c.getData() << endl;
  39. a.setData(20);
  40. c = b= a;
  41. cout << a.getData() << endl << b.getData() << endl << c.getData() << endl;
  42. return 0;
  43. }

结果:,可以看出仅仅是在每次赋值完后多了一次拷贝。现在考虑一个情况

如果是(c=b)=a;这种方式呢?

结果:。分析:因为c=b,返回的是一个临时的对象,因此其实最后a赋值给了一个临时变量且多了一次拷贝。

如果换成reference to *this,test& operator= (const test &t) ,查看结果

   (c=b)=a,对象c被成功赋值,且整个过程少了两次拷贝。

有的童鞋可能要问,为什么返回this,不是其他。首先明确一点,this是对象的指针。a=b,调用的是对象a的赋值构造函数,赋值结束后,肯定要返回对象a。例如int a = 1; 赋值结束后,肯定返回的是a。

总结:赋值构造函数为了实现赋值操作完成后,可以作为左值接受其他对象的赋值。因此必须返回一个reference to *this,如果返回位值类型,且如果作为左值,则其其对象得不到想要的赋值结果,因为作为左值的是值类型的临时对象。返回引用reference to *this时,赋值操作作为左值,可得到正确的赋值结果。

来自为知笔记(Wiz)

时间: 2024-10-13 17:01:08

C++ 赋值函数为什么返回reference to *this?的相关文章

为什么类的拷贝构造参数加引用、重载赋值函数的返回值和参数加引用

class string { public: string(const char *str=NULL); string(const string& str);     //copy构造函数的参数为什么是引用呢? string& operator=(const string & str); //赋值函数为什么返回值是引用呢?参数为什么是引用呢? ~string(); }; 下面我就给大家解释一下: class String1 { public: String1(const char*

赋值函数与拷贝构造的差异

C++ 拷贝构造函数 赋值构造函数 ================================= 一句话,赋值函数的前提是对象已定义:而拷贝构造是执行时才会创建一个对象.拷贝构造需要的是深拷贝. 赋值函数一般模式: type& operator =(const type& par) { // (1) 检查自赋值 if( this == &par ) return *this; // (2) 释放原有的内存资源 //(3)分配新的内存资源,并复制内容 ,2.3顺序没讲究,注意释

c++笔记:const、初始化、copy构造/析构/赋值函数

构造函数 Default构造函数:可被调用而不带任何实参的构造函数,没有参数或每个参数都有缺省值.如: class A { public: A(); }; 将构造函数声明为explicit,可阻止它们被用来执行隐式类型转换,但仍可用来进行显示类型转换.如: class B { public: explicit B(int x = 0, bool b = ture); }; copy构造函数:用于以同型对象初始化自我对象,以passed by value的方式传递对象:· copy assignm

函数的返回值

1.params 可变参数  必须出现在参数列表的最后. 2.ref 仅仅是一个地址,引用传递,可以把值传递强制改为引用传递 3.out 让函数可以输出多个值 •1.在方法中必须为out参数赋值 •2.out参数的变量在传递之前不需要赋值,即使赋值了也不能在方法中使用.(赋值没意义) 3ref •参数在传递之前必须赋值 •在方法中可以不为ref参数赋值,可以直接使用. ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所. 函数的返回值,布布扣

C++中拷贝构造函数和赋值函数被调用的时机

一.拷贝构造函数被调用的时机: 1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值. 2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数. 3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数. 二.赋值函数被调用的时机: 当用一个对象赋值给另一个对象时 注意一.二中初始化和赋值的区别 C++中拷贝构造函数和赋值函数被调用的时机,布布扣,bubuko.com

shell获取函数的返回值

背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的. 定义一个函数 functionname(){ 操作内容 echo 输出内容 return 返回值 #返回值可有可不有 } 获得函数的返回值 1.函数默认是将标准输出传递出来,不是返回值. 所以如果直接调用functionname,实际上是将输出传递回来 例如: a=`functionname` 将函数functionname的标准输出传递给a 2.调用函数不需要加()

编写类String 的构造函数、析构函数和赋值函数

编写类String 的构造函数.析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str = NULL); // 普通构造函数String(const String &other); // 拷贝构造函数~ String(void); // 析构函数String & operate =(const String &other); // 赋值函数private:char *m_data; // 用于保存字符串

c++赋值构造函数为什么返回引用类型?

目录 0 前言 1 内置类型 2 自定义类型 3 结论 4 源码 0. 前言 c++默认赋值构造函数的返回值是引用类型,c++赋值运算符=的本意是返回左值的引用,我们重载赋值构造函数的时候,返回值是否应该设为引用类型呢? 按照<Effective C++>中第10条,最好是设为引用类型. 本文,通过实验来表述返回值是否为引用类型的区别. 1. 内置类型 int i= 1,     j=2,    k=3; case1: k = j = i i == 1 j == 1 k == 1 case2:

python学习之---匿名函数,返回函数,偏函数

1. 返回函数: 所谓的返回函数,指的是函数作为返回值.高阶函数除了可以接受函数作为参数外,同样可以接受函数作为结果返回.以下是一个可变参数的求和例子,一般求和函数是如此这般定义的: 1 >>> def sum(*args): 2 ... ax = 0 3 ... for x in args: 4 ... ax += x 5 ... return ax 6 ... 以上函数一旦定义,在调用这个函数的时候,只要传入参数就会立刻执行.但是,如果条件需要不要立刻求和,而是在后面的代码中,根据需