0
点赞
收藏
分享

微信扫一扫

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

代码小姐 2022-06-02 阅读 60

一、返回值问题

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


举报

相关推荐

0 条评论