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

  • 相关阅读:
    IOS 模块并且发布到NPM
    处理npm publish报错问题
    IOS 应用发布流程
    《温故而知新》JAVA基础八
    Beta冲刺 (5/7)
    Beta冲刺 (4/7)
    Beta冲刺 (3/7)
    Beta冲刺 (2/7)
    软件测试(团队)
    福大软工 · BETA 版冲刺前准备(团队)
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13903878.html
Copyright © 2011-2022 走看看