29 逗号操作符重载分析

1 逗号操作符

  • 逗号操作符(,)可以构成逗号表达式

    • 逗号表达式用于将多个子表达式连接为一个表达式
    • 逗号表达式的值为最后一个子表达式的值
    • 逗号表达式中的前 N-1 个子表达式可以没有返回值
    • 逗号表达式按照从左向右的顺序计算子表达式的值
    exp1,exp2,exp3,...,expN
    
  • 示例1:逗号表达式

    • Demo

      #include <iostream>
      #include <string>
      
      using namespace std;
      
      void func(int i)
      {
          cout << "func() : i = " << i << endl;
      }
      
      int main()
      {   
          int a[3][3] = {
              (0, 1, 2),
              (3, 4, 5),
              (6, 7, 8)
          };
          
          int i = 0;
          int j = 0;
          
          while( i < 5 )    
              func(i),
          
          i++;
              
          for(i = 0; i < 3; i++)
          {
              for(j = 0; j < 3; j++)
              {
                  cout << a[i][j] << endl;
              }
          }
          
          (i, j) = 6;
          
          cout << "i = " << i << endl;
          cout << "j = " << j << endl;
      
          return 0;
      }
      
    • 编译运行

      func() : i = 0
      func() : i = 1
      func() : i = 2
      func() : i = 3
      func() : i = 4
      2
      5
      8
      0
      0
      0
      0
      0
      0
      i = 3
      j = 6
      

2 重载逗号操作符

  • 在 C++ 中重载逗号是合法

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

  • 重载函数的参数必须有一个是类类型

  • 重载函数的返回值类型必须是引用

    ClassName& operator , (const ClassName& a, const ClassName& b)
    {
        return const_cast<ClassName&>(b);
    }
    
  • 示例:重载逗号操作符

    • Demo

      #include <iostream>
      #include <string>
      
      using namespace std;
      
      class Test
      {
          int mValue;
      public:
          Test(int i)
          {
              mValue = i;
          }
          int value()
          {
              return mValue;
          }
      };
      
      Test& operator , (const Test& a, const Test& b)
      {
          return const_cast<Test&>(b);
      }
      
      Test func(Test& i)
      {
          cout << "func() : i = " << i.value() << endl;
          
          return i;
      }
      
      int main()
      {   
          Test t0(0);
          Test t1(1);
          Test tt = (func(t0), func(t1));         // Test tt = func(t1);
          
          cout << tt.value() << endl; // 1
          
          return 0;
      }
      
    • 编译运行

      func() : i = 1
      func() : i = 0
      1
      
    • 存在的问题:从右往左计算表达式

  • 问题分析

    • C++ 通过函数调用扩展操作符的功能
    • 进入函数体前必须完成所有参数的计算
    • 函数参数的计算次序是不定的
    • 重载后无法严格地按照从左向右的顺序计算表达式
  • 结论:工程中不要重载逗号操作符

posted @ 2020-10-30 19:32  nxgy  阅读(74)  评论(0编辑  收藏  举报