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