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

一、返回值问题

 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

原文地址:https://www.cnblogs.com/FengZeng666/p/9324833.html