C++中逗号操作符重载的分析
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++中逗号操作符重载的分析的更多相关文章
- 【C++】C++中的操作符重载
C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...
- C++中的操作符重载
一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...
- Python中的操作符重载
运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果. 类可以重载python的操作符 操作符重载使我们的对 ...
- C++中采用操作符重载完善复数类
1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...
- Python中逗号作用的实例分析
逗号在类型转化中的使用 主要是元组的转换 例如: >>> a=11>>> b=(a)>>> b11>>> b=(a,)>& ...
- 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 ...
- c++ 逗号操作符重载
Overload Operator Comma 首先看看think in c++ 给出的一个重载的样例 #include <iostream> using namespace std; c ...
- C++中操作符重载的概念
1,下面的复数解决方案是否可行? 1,代码示例: class Comples { public: int a; int b; }; int main() { Complex c1 = {, }; Co ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...
随机推荐
- 关于URL和URI的最简单理解
以下面网址为例: http://www.sina.com/news/1.html 那么,http://www.sina.com/news/1.html就表示URL,用于标识互联网中的某一资源:/new ...
- Vue2.0源码阅读笔记(四):nextTick
在阅读 nextTick 的源码之前,要先弄明白 JS 执行环境运行机制,介绍 JS 执行环境的事件循环机制的文章很多,大部分都阐述的比较笼统,甚至有些文章说的是错误的,以下为个人理解,如有错误, ...
- 我心中的ASP.NET Core 新核心对象WebHost(一)
以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...
- JS面向对象——动态原型模型、寄生构造模型
动态原型模型 组合使用构造函数模型和原型模型,使得OO语言程序员在看到独立的构造函数和原型时很困惑.动态原型模型致力于解决该问题,它把所有的信息封装在构造函数中,通过在构造函数中初始化原型(仅在必要情 ...
- facenet 人脸识别(一)
前言 已完成TensorFlow Object Detection API环境搭建,具体搭建过程请参照: 安装运行谷歌开源的TensorFlow Object Detection API视频物体识别系 ...
- smbumount - 为普通用户卸载smb文件系统
总览 smbumount 装载点 描述 普通用户使用这个程序可以卸载smb文件系统.它在工作时会suid到root身份,并且向普通linux用户提供了对资源更多的控制能力.在suid方面,它拥有足够的 ...
- 微信小程序(12)--倒计时
记录一个常见的效果,倒计时. <text>倒计时:{{content}}</text> Page({ /** * 页面的初始数据 */ data: { endTime: '', ...
- Kvm--03 kvm克隆,桥接网络,热添加
目录 1.Kvm克隆 1). 完整克隆 2). 链接克隆 2.kvm虚拟机的桥接网络 3.在线热添加网卡,cpu 1). 热添加网卡 2). 热添加内存 3). 热添加cpu参数 1.Kvm克隆 1) ...
- Word里的红色、绿色和蓝色波浪线
有时候我们写完文章会发现,有的地方有红色波浪线,有的地方有绿色/蓝色二重线,那么这两种线各代表什么意思呢?其实红色波浪线代表此处存在拼写错误,绿色/蓝色波浪线代表此处可能有语法错误.如果你不希望Wor ...
- MySQL-其它整理
来自:http://www.w3school.com.cn/sql/sql_server.asp 一:基本操作 1)插入 INSERT INTO 表名称 VALUES (值1, 值2,....): I ...