C++中逗号操作符重载的分析

1,关注逗号操作符重载后带来的变化;

 

2,逗号操作符:

    1,逗号操作符(,)可以构成都好表达式:exp1, exp2, exp3, ..., expN

       1,逗号表达式用于将多个表达式连接为一个表达式;

           1,就是用来起连接不同语句作用的;

       2,逗号表达式的值为最后一个子表达式的值;

           1,最后一个必须有值;

       3,逗号表达式中的前 N - 1 个子表达式可以没有返回值;

       4,逗号表达式按照从左向右的顺序计算每个子表达式的值;

           1,不能违反这个原生语义;

      

3,逗号表达式的示例实例分析:

    1,main.cpp 文件:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 void func(int i)
 7 {
 8     cout << "func() : i = " << i << endl;
 9 }
10 
11 int main()
12 {   
13     int a[3][3] = {
14         (0, 1, 2),  // 用了括号,就变成逗号表达式,只有一个值 2;
15         (3, 4, 5),  // 用了括号,就变成逗号表达式,只有一个值 5;
16         (6, 7, 8)  // 用了括号,就变成逗号表达式,只有一个值 8;
17     };
18     /*
19     // 更改如下方可
20     int a[3][3] = {
21         {0, 1, 2},
22         {3, 4, 5},
23         {6, 7, 8}
24     };
25     */
26     
27     int i = 0;
28     int j = 0;
29     
30     while( i < 5 )    
31         func(i),  // 这里是一个逗号表达式;
32     
33     i++;  
34 
35     /* 上条语句等价于这条 */
36     while( i < 5 )
37     {
38         func(i);
39       
40         i++;
41     }
42         
43     for( i=0; i<3; i++)
44     {
45         for(j=0; j<3; j++)
46         {
47             cout << a[i][j] << endl;
48         }
49     }
50     
51     (i, j) = 6;  // 左边是一个逗号表达式
52     
53     cout << "i = " << i << endl;
54     cout << "j = " << j << endl;
55 
56     return 0;
57 }

 2,输出结果:

 1 func() : i = 0
 2 func() : i = 1
 3 func() : i = 2
 4 func() : i = 3
 5 func() : i = 4
 6 2
 7 5
 8 8
 9 0
10 0
11 0
12 0
13 0
14 0
15 i = 3
16 j = 6

   

4,重载逗号操作符:

1 Class& operator , (const Class& a, const Class& b)
2 {
3      return const_cast<Class&>(b);  // 返回第二个参数;
4 }

    1,在 C++ 中重载逗号操作符是合法的;

    2,使用全局函数对逗号操作符进行重载;

       1,推荐使用全局函数对逗号操作符进行重载,不要使用成员函数的方式;

    3,重载函数的参数必须有一个是类类型;

    4,重载函数的返回值类型必须是引用;

   

5,重载逗号操作符编程实验:

    1,main.cpp 文件:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Test
 7 {
 8     int mValue;
 9 public:
10     Test(int i)
11     {
12         mValue = i;
13     }
14     int value()
15     {
16         return mValue;
17     }
18 };
19 
20 /* 推荐用全局重载 */
21 Test& operator , (const Test& a, const Test& b)
22 {
23     return const_cast<Test&>(b);
24 }
25 
26 Test func(Test& i)  // 返回值不能为 void,否则报错;
27 {
28     cout << "func() : i = " << i.value() << endl;
29     
30     return i;
31 }
32 
33 int main()
34 {   
35     Test t0(0);
36     Test t1(1);
37     Test tt = (func(t0), func(t1));  // ==> Test tt = func(t1); ==> Text tt = (operator , (func(t0), func(t1)));
38     
39     cout << tt.value() << endl; // 1
40     
41     return 0;
42 }

 2,输出结果:

     func() : i = 1

     func() : i = 0

     1

    3,结论:

       1,从右向左执行逗号表达式中的表达式;

       2,最终结果是逗号表达式最后一个值;

    4,当不重载逗号操作符的时候:

       1,输出结果:

               func() : i = 0

    func() : i = 1

    1

       2,严格的按照从左向右的顺序执行逗号表达式中的表达式,并返回最后一个子表达式的值;

    5,结论:

       1,工程中,最没必要重载的就是逗号表达式;

 

6,重载逗号操作符:

    1,问题的本质分析:

       1,C++ 通过函数调用扩展操作符的功能;

       2,进入函数体前必须完成所有参数的计算;

       3,函数参数的计算次序是不定的;

       4,重载后无法严格从左向右计算表达式;

    2,工程中不要重载逗号操作符;

   

7,小结:

    1,逗号表达式从左向右顺序计算每个子表达式的值;

    2,逗号表达式的值为最后一个子表达式的值;

    3,操作符重载无法完全实现逗号操作符的原生意义;

    4,工程开发中不要重载逗号操作符;

原文地址:https://www.cnblogs.com/dishengAndziyu/p/10913855.html