重载逗号表达式
Posted chengeputongren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重载逗号表达式相关的知识,希望对你有一定的参考价值。
重载逗号表达式的注意点
-
首先复习一下逗号表达式
-
逗号操作符(,)可以构成逗号表达式
-
逗号表达式用于将多个子表达式连接为一个表达式
-
逗号表达式的值为最后一个子表达式的值
-
逗号表达式中的前N-1个子表达式可以没有返回值
-
逗号表达式按照从左向右的顺序计算每个子表达式的值
exp1,exp2,exp3,...,expn
-
重载逗号表达式
-
在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++通过函数调用扩展操作符的功能
-
进入函数之前必须完成所有参数的计算
-
函数参数的计算次序是不定的
-
重载后无法严格按照从左向右计算表达式
-
工程中不要重载逗号操作符
-
小结:
-
逗号表达式从左向右计算每个子表示的值
-
逗号表达式的值为最后一个子表达式的值
-
操作符重载无法完全实现逗号操作符的原生意义
-
工程开发中不要重载逗号表达式
以上是关于重载逗号表达式的主要内容,如果未能解决你的问题,请参考以下文章