zoukankan      html  css  js  c++  java
  • 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,工程开发中不要重载逗号操作符;

  • 相关阅读:
    java并发:简单面试问题集锦
    Java:泛型
    Java:注解(元数据)
    Java:反射
    Java:静态代理 and 动态代理
    华为机试题——该警醒了,骚年
    java并发:线程同步机制之Lock
    java并发:中断一个正在运行的线程
    java中String类型变量的赋值问题
    java中的自增问题
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10913855.html
Copyright © 2011-2022 走看看