重载逗号表达式

重载逗号表达式的注意点

  • 首先复习一下逗号表达式
  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. 工程开发中不要重载逗号表达式

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/chengeputongren/p/12236323.html

时间: 2024-08-04 14:02:51

重载逗号表达式的相关文章

关于宏和逗号表达式

宏是C编译系统的预处理,何谓“预”?即是正式工作开始之前的准备工作.所以宏替换是在对程序编译之前进行的~也就是直接将宏定义的字符,转换成后面的表达式. 逗号表达式:逗号运算符,优先级别最低,它将两式联接起来,可连续执行 代码:直接对文件输出1-1000的数字 #include <stdio.h> #define B P,P,P,P,P,P,P,P,P,P #define P L,L,L,L,L,L,L,L,L,L #define L I,I,I,I,I,I,I,I,I,I,N #define

逗号表达式

/** 目的:逗号表达式的例子时间:2015年7月11日23:11:11 */#include <stdio.h> int main(void){ int i; int j = 2; i = (j++, ++j, j + 2, j - 3); printf("i = %d\n",i); printf("j = %d\n",j); return 0;} /** 在VC++6.0中运行结果为:------------------------ i = 1j =

第18课 三目运算符和逗号表达式

1. 三目运算符 (1)三目运算符(a?b:c)可以作为逻辑运算的载体 (2)规则:当a的值为真时,返回变量b的值(而不是变量本身):否则返回c的值. [实例分析]三目运算符初探 #include <stdio.h> int main() { int a = 1; int b = 2; int c = 0; c = a < b ? a : b; //(a<b)?a:b; //以下代码试图根据条件有选择地给a或b变量赋值.但这样的 //代码是错的,因为三目运算符的返回值是a或b变量的

C++逗号表达式

转自:https://zhidao.baidu.com/question/106961628.html 逗号表达式的语法为: 表达式1,表达式2,...表达式n C++顺序计算表达式1,表达式2,--,表达式n的值.例如: int a,b,c: a=l,b=a+2, c=b+3: 由于按顺序求值, 所以能够保证b一定在a赋值之后, c一定在b赋值之后.该逗号表 达式可以用下面3个有序的赋值语句来表示: a=1: b=a+2: c=b+3: 逗号表达式是有值的,这一点是语句所不能代替的.逗号表达式

C-1 简单数据类型转换, scanf缓冲区, 逗号表达式

关于类型转换: 1.int 如果是超出了int的范围,会溢出 如果超出了太多,报错 如果是一个小数,只会截取整数部分, 不会四舍五入 2.float 如果是一个double类型的小数,double→float 如果是一个int类型的整数,int→float 3.double 如果是一个float,float→double 如果是一个int,int→double 4.char 自动转换的顺序是: char → int → float → double scanf缓冲区问题 在接收输入的时候,sca

《逗号表达式》

//对逗号表达式的考察. /* * 逗号表达式的运算方向是从左到右的,返回值是最后那个表达式的值. * 所以下面一个程序返回的结果是50 */ #include<stdio.h> int main() { int x; printf("%d\n",(x=5*6,x*2,x+20)); return 0; }

c语言中逗号运算符和逗号表达式

原文:c语言中逗号运算符和逗号表达式 C语言提供一种特殊的运算符——逗号运算符.用它将两个表达式连接起来.如: 3+5,6+8 称为逗号表达式,又称为“顺序求值运算符”.逗号表达式的一般形式为 表达式1,表达式2 逗号表达式的求解过程是:先求解表达式1,再求解表达式2.整个逗号表达式的值是表达式2的值.例如,上面的逗号表达式“3+5,6+8”的值为14.又如,逗号表达式 a=3*5,a*4对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达

逗号表达式的使用

逗号操作符,是优先级最低的一个. eg1: #include<stdio.h> int main() { int a,b; a=b=1; b=a++,b++,++a; printf("b=%d\n",b); return(0); } eg2: #include<stdio.h> int main() { int a=8; printf("%d",(a=3*5,a*4)); return(0); } c语言提供一种特殊的运算符,逗号运算符,优先

C-表达式 赋值 自增自减 sizeof 逗号表达式

1.表达式:用运算符把常量.变量.函数按照一定的规则,连接起来的式子,就称为表达式. 分   类:表达式包含关系运算符.算术运算符.逻辑运算符(P:表达式一定都有返回值).. 表达式语句:表达式后面加上分号“;”,构成表达式语句.. 2.赋值运算符=(结合方向:右到左): int a , b ,c ; a=b=c=0; printf("a=%d,b=%d,c=%c",a,b,c); //输出结果为a=0,b=0,c=0; 1 int a =b=c=1; 2 printf("a