1,关注逗号操作符重载后带来的变化;

2,逗号操作符:

1,逗号操作符(,)可以构成都好表达式:exp1, exp2, exp3, ..., expN

1,逗号表达式用于将多个表达式连接为一个表达式;

1,就是用来起连接不同语句作用的;

2,逗号表达式的值为最后一个子表达式的值;

1,最后一个必须有值;

3,逗号表达式中的前 N - 1 个子表达式可以没有返回值;

4,逗号表达式按照从左向右的顺序计算每个子表达式的值;

1,不能违反这个原生语义;

3,逗号表达式的示例实例分析:

1,main.cpp 文件:

 #include <iostream>
#include <string> using namespace std; void func(int i)
{
cout << "func() : i = " << i << endl;
} int main()
{
int a[][] = {
(, , ), // 用了括号,就变成逗号表达式,只有一个值 2;
(, , ), // 用了括号,就变成逗号表达式,只有一个值 5;
(, , ) // 用了括号,就变成逗号表达式,只有一个值 8;
};
/*
// 更改如下方可
int a[][] = {
{, , },
{, , },
{, , }
};
*/ int i = ;
int j = ; while( i < )
func(i), // 这里是一个逗号表达式; i++; /* 上条语句等价于这条 */
while( i < )
{
func(i);   i++;
} for( i=; i<; i++)
{
for(j=; j<; j++)
{
cout << a[i][j] << endl;
}
} (i, j) = ; // 左边是一个逗号表达式 cout << "i = " << i << endl;
cout << "j = " << j << endl; return ;
}

 2,输出结果:

 func() : i =
func() : i =
func() : i =
func() : i =
func() : i = i =
j =

4,重载逗号操作符:

 Class& operator , (const Class& a, const Class& b)
{
return const_cast<Class&>(b); // 返回第二个参数;
}

1,在 C++ 中重载逗号操作符是合法的;

2,使用全局函数对逗号操作符进行重载;

1,推荐使用全局函数对逗号操作符进行重载,不要使用成员函数的方式;

3,重载函数的参数必须有一个是类类型;

4,重载函数的返回值类型必须是引用;

5,重载逗号操作符编程实验:

1,main.cpp 文件:

 #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) // 返回值不能为 void,否则报错;
{
cout << "func() : i = " << i.value() << endl; return i;
} int main()
{
Test t0();
Test t1();
Test tt = (func(t0), func(t1)); // ==> Test tt = func(t1); ==> Text tt = (operator , (func(t0), func(t1))); cout << tt.value() << endl; // return ;
}

 2,输出结果:

 func() : i = 1

 func() : i = 0

 1

3,结论:

1,从右向左执行逗号表达式中的表达式;

2,最终结果是逗号表达式最后一个值;

4,当不重载逗号操作符的时候:

1,输出结果:

func() : i = 0

    func() : i = 1

    1

2,严格的按照从左向右的顺序执行逗号表达式中的表达式,并返回最后一个子表达式的值;

5,结论:

1,工程中,最没必要重载的就是逗号表达式;

6,重载逗号操作符:

1,问题的本质分析:

1,C++ 通过函数调用扩展操作符的功能;

2,进入函数体前必须完成所有参数的计算;

3,函数参数的计算次序是不定的;

4,重载后无法严格从左向右计算表达式;

2,工程中不要重载逗号操作符;

7,小结:

1,逗号表达式从左向右顺序计算每个子表达式的值;

2,逗号表达式的值为最后一个子表达式的值;

3,操作符重载无法完全实现逗号操作符的原生意义;

4,工程开发中不要重载逗号操作符;

C++中逗号操作符重载的分析的更多相关文章

  1. 【C++】C++中的操作符重载

    C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...

  2. C++中的操作符重载

    一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...

  3. Python中的操作符重载

    运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果.     类可以重载python的操作符 操作符重载使我们的对 ...

  4. C++中采用操作符重载完善复数类

    1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...

  5. Python中逗号作用的实例分析

    逗号在类型转化中的使用 主要是元组的转换 例如: >>> a=11>>> b=(a)>>> b11>>> b=(a,)>& ...

  6. Groovy中的操作符重载

    操作者 方法 a + b a.plus(b)中 a - b a.minus(b)中 a * b a.multiply(b)中 a ** b a.power(b)中 a / b a.div(b)中 a ...

  7. c++ 逗号操作符重载

    Overload Operator Comma 首先看看think in c++ 给出的一个重载的样例 #include <iostream> using namespace std; c ...

  8. C++中操作符重载的概念

    1,下面的复数解决方案是否可行? 1,代码示例: class Comples { public: int a; int b; }; int main() { Complex c1 = {, }; Co ...

  9. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换

    C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...

随机推荐

  1. 谁动了我的内存:php内存泄露,系统缓存消耗? 转摘:http://blog.csdn.net/tao_627/article/details/9532497

    http://www.laruence.com/2011/03/04/1894.html 前言:持续我一贯的标题党作风,说说例子解决方案,没有深入探讨. 情景:线上图片服务压缩的图片品质(100),缩 ...

  2. 求解:为什么impala实现hive查询 可以使用ifnull()函数,不可以使用length() 函数

    求大神解惑,找了很久都没有找到为什么??? hive支持length() 函数,不支持ifnull()函数??? impala实现hive查询 支持ifnull()函数,不支持length()  函数 ...

  3. falcon的api

    一.判断session是否有效 # -*- coding: UTF- -*- #!/usr/bin/env python # Created by Administrator on // import ...

  4. echarts改变图例位置

    只需要legend属性中修改如下几个示数即可: legend:{ orient:"horizontal", x:'right', y:' center', width:'100', ...

  5. RabbitMQ基于Stomp实现与MQTT客户端通信

    请参照RabbitMQ应用和SpringBoot集成RabbitMQ并实现消息确认机制 详情参照官方文档https://www.rabbitmq.com/stomp.html.https://gith ...

  6. Mac版Navicat Premium激活教程

    工具: Navicat Premium12.0.20 安装包 下载注册机工具包 链接:https://pan.baidu.com/s/1NS8gk780ds1Xn-zHrSIzIw  密码:dvke ...

  7. 一、表单和ajax中的post请求&&后台获取数据方法

    一.表单和ajax中的post请求&&后台获取数据方法 最近要做后台数据接收,因为前台传来的数据太过于混乱,所以总结了一下前台数据post请求方法,顺便写了下相对应的后台接收方法. 前 ...

  8. Sass-@if的使用

    @if 指令是一个 SassScript,它可以根据条件来处理样式块,如果条件为 true 返回一个样式块,反之 false 返回另一个样式块.在 Sass 中除了 @if 之,还可以配合 @else ...

  9. MongoDB 存储引擎选择

    MongoDB存储引擎选择 MongoDB存储引擎构架 插件式存储引擎, MongoDB 3.0引入了插件式存储引擎API,为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化无疑参考了MyS ...

  10. 1、pip不是内部运行程序 解决方法

    一.方式一 1.切换到pip所在路径: shit+ 右键. 再此处打开运行窗口 2.执行 pip install pytest 脚本即可. 二.方式二,添加环境变量 1.将pip所在的文件路径 添加到 ...