• 类的成员函数的连续调用与返回值问题


    一、返回值问题

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class X
     6 {
     7 public:
     8     int a = 3;
     9     X set1(int b)
    10     {
    11         a = b;
    12         return *this;
    13     }
    14 };
    15 
    16 int main()
    17 {
    18     X x;
    19     x.set1(6);
    20     cout << x.a;
    21 
    22     return 0;
    23 }

    此处set1函数的返回值为X,而非X&,所以x.set1(6)返回的是x的一个副本,并非x对象本身,但是return之前的语句,即此处的a = b,仍是对x对象本身进行操作的(因为是对象x调用的此函数,即此处的a仍为x.a,因为a不可能是凭空拷贝出来的),只是返回值为x对象的副本而已,所以x.a的值仍然被修改为了6.

    二、连续调用问题

    (1)set1与set2的返回值是引用

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class X
     6 {
     7 public:
     8     X display()
     9     {
    10         cout << a;
    11         return *this;
    12     }
    13     X& set1(int b)
    14     {
    15         a = b;
    16         return *this;
    17     }
    18 
    19     X& set2(int b)
    20     {
    21         a = b;
    22         return *this;
    23     }
    24 
    25 private:
    26     int a = 3;
    27 };
    28 
    29 int main()
    30 {
    31     X x;
    32     x.set1(6).set2(7).display(); 
    33     cout << “ ”;
    34     x.display();
    35 
    36 
    37     return 0;
    38 
    39 }

    如果set1与set2的返回值是引用,那么

    x.set1(6).set2(7).display();     //等价于x.set1(6);  x.set2(7);  x.display(); 

    所以此处输出为:7   7

    (2)set1与set2的返回值不是引用

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class X
     6 {
     7 public:
     8     X display()
     9     {
    10         cout << a;
    11         return *this;
    12     }
    13     X set1(int b)
    14     {
    15         a = b;
    16         return *this;
    17     }
    18 
    19     X set2(int b)
    20     {
    21         a = b;
    22         return *this;
    23     }
    24 
    25 private:
    26     int a = 3;
    27 };
    28 
    29 int main()
    30 {
    31     X x;
    32     x.set1(6).set2(7).display(); 
    33     cout << “ ”;
    34     x.display();
    35 
    36 
    37     return 0;
    38 
    39 }

    如果set1与set2的返回值是引用,那么

    x.set1(6).set2(7).display();     //不等价于x.set1(6);  x.set2(7);  x.display(); 此时后面的.set2(7).display()是对x.set1(6)返回的副本进行操作,所以此处只有x.set1(6)对原对象的值进行了操作

    故此处输出为:7   6

  • 相关阅读:
    Assembly Manifest 通俗简易手册
    CruiseControl服务器安装配置
    关于URL编码
    从A到Z来说说Web开发
    通过注册表查看 .NET Framework的版本信息
    云数据存在哪里?
    C#中你可能不知道的8件事(zz)
    用PBKDF2 或BCrypt 来存储密码
    C++编译器什么时候为我们自动生成拷贝构造函数?
    C#中你可能不知道的8件事(zz)
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9324833.html
Copyright © 2020-2023  润新知