重载逗号表达式

Posted chengeputongren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重载逗号表达式相关的知识,希望对你有一定的参考价值。

重载逗号表达式的注意点
  • 首先复习一下逗号表达式
  1. 逗号操作符(,)可以构成逗号表达式
  2. 逗号表达式用于将多个子表达式连接为一个表达式
  3. 逗号表达式的值为最后一个子表达式的值
  4. 逗号表达式中的前N-1个子表达式可以没有返回值
  5. 逗号表达式按照从左向右的顺序计算每个子表达式的值
        exp1,exp2,exp3,...,expn
  • 重载逗号表达式
  1. 在C++中重载逗号操作符是合法的
  2. 使用全局函数对逗号操作符进行重载
  3. 重载函数的参数必须有一个是类类型
  4. 重载函数的返回值类型必须是引用
//重载逗号表达式
Test& operator , (const Test& a,const Test&b)
{
    return const_cast<Test&>(b);
}

例:
 1 // 重载逗号表达式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
 2 //
 3 #include <iostream>
 4 #include <string>
 5 using namespace std;
 6 class Test
 7 {
 8     int mvalue;
 9 public:
10     Test(int _val)
11     {
12         mvalue = _val;
13     }
14     int get_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 Test func(Test&i)
25 {
26     cout << "Test.mvalue = " << i.get_value() << endl;
27     return i;
28 }
29 int main()
30 {
31     Test t0(0);
32     Test t1(1);
33     Test t2 = (t0,t1);             //逗号表达式
34     Test t3 = (func(t0), func(t1));//通常来说,应该是先执行func(t0),在执行func(t1),但是在这儿却相反
35     cout << "t2.mvalue = " << t2.get_value() << endl;
36     cout << "t3.mvalue = " << t3.get_value() << endl;
37 }
运行结果:
Test.mvalue = 1
Test.mvalue = 0
t2.mvalue = 1
t3.mvalue = 1
按照逗号表达式的语法,我们知道逗号表达式中每个子表达式的计算顺序是从左向右,但是如果把逗号操作符重载,将会失去逗号操作符的语义。
  • 问题的本质分析
  1. C++通过函数调用扩展操作符的功能
  2. 进入函数之前必须完成所有参数的计算
  3. 函数参数的计算次序是不定的
  4. 重载后无法严格按照从左向右计算表达式
  5. 工程中不要重载逗号操作符
  • 小结:
  1. 逗号表达式从左向右计算每个子表示的值
  2. 逗号表达式的值为最后一个子表达式的值
  3. 操作符重载无法完全实现逗号操作符的原生意义
  4. 工程开发中不要重载逗号表达式
 
 
 
 
 
 

以上是关于重载逗号表达式的主要内容,如果未能解决你的问题,请参考以下文章

实现是不是应该防止逗号重载?

导航架构片段重载问题

重载逗号运算符*真的*会影响其操作数的评估顺序吗?

导航架构片段重载问题

void()、逗号运算符 (operator,) 和不可能的 (?) 重载

lambda表达式