一、返回值问题
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