- 首先复习一下逗号表达式
- 逗号操作符(,)可以构成逗号表达式
- 逗号表达式用于将多个子表达式连接为一个表达式
- 逗号表达式的值为最后一个子表达式的值
- 逗号表达式中的前N-1个子表达式可以没有返回值
- 逗号表达式按照从左向右的顺序计算每个子表达式的值
- 重载逗号表达式
- 在C++中重载逗号操作符是合法的
- 使用全局函数对逗号操作符进行重载
- 重载函数的参数必须有一个是类类型
- 重载函数的返回值类型必须是引用
//重载逗号表达式 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 按照逗号表达式的语法,我们知道逗号表达式中每个子表达式的计算顺序是从左向右,但是如果把逗号操作符重载,将会失去逗号操作符的语义。
- 问题的本质分析
- C++通过函数调用扩展操作符的功能
- 进入函数之前必须完成所有参数的计算
- 函数参数的计算次序是不定的
- 重载后无法严格按照从左向右计算表达式
- 工程中不要重载逗号操作符
- 小结:
- 逗号表达式从左向右计算每个子表示的值
- 逗号表达式的值为最后一个子表达式的值
- 操作符重载无法完全实现逗号操作符的原生意义
- 工程开发中不要重载逗号表达式