• 第39课 逗号操作符的分析


    逗号操作符:

    我们如果重载逗号操作符,必须遵守上面的几点。特别是最后两点。

    逗号操作符示例:

     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),
    15         (3, 4, 5),
    16         (6, 7, 8)
    17     };
    18     
    19     int i = 0;
    20     int j = 0;
    21     
    22     while( i < 5 )    
    23         func(i),
    24     
    25     i++;
    26         
    27     for(i=0; i<3; i++)
    28     {
    29         for(j=0; j<3; j++)
    30         {
    31             cout << a[i][j] << endl;
    32         }
    33     }
    34     
    35     (i, j) = 6;
    36     
    37     cout << "i = " << i << endl;
    38     cout << "j = " << j << endl;
    39 
    40     return 0;
    41 }

    第35行等价于 j = 6。

    重载逗号操作符:

     重载逗号操作符要用全局函数。

    示例程序:

    我们将36行改成func调用的形式:

    我们期望36行先计算func(t0),再计算func(t1),但是从输出结果可以看出,先计算的是func(t1)。这违背了逗号表达式的原生语义。

    问题的本质分析:

    我们将重载的逗号操作符注释掉,再次演示:

     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 Test& operator , (const Test& a, const Test& b)
    21 {
    22     return const_cast<Test&>(b);
    23 }
    24 */
    25 Test func(Test& i)
    26 {
    27     cout << "func() : i = " << i.value() << endl;
    28     
    29     return i;
    30 }
    31 
    32 int main()
    33 {   
    34     Test t0(0);
    35     Test t1(1);
    36     Test tt = (func(t0), func(t1));         // Test tt = func(t1);
    37     
    38     cout << tt.value() << endl; // 1
    39     
    40     return 0;
    41 }

     输出结果如下:

    这意味着第36行的逗号表达式严格的从左向右执行了。而且返回了最后一个表达式的值。

    工程中不要重载逗号操作符。

    小结:

  • 相关阅读:
    AnyConnect使用说明(手机版)
    AnyConnect使用说明(电脑版Windows)
    Linux中MySQL中文乱码问题
    Redis的最常被问到知识点总结
    DML、DDL、DCL是什么?
    刨死你系列——手撕ArrayList
    刨死你系列——LinkedHashMap剖析(基于jdk1.8)
    mysql架构与存储引擎 (Myisam与Innodb)
    面试有关TCP常问的几个问题
    刨死你系列——HashMap剖析(基于jdk1.8)
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9573832.html
Copyright © 2020-2023  润新知