C++知识点41——运算符的重载概念与分数类实现(下)
接上篇文章https://blog.csdn.net/Master_Cui/article/details/109515571继续实现分数类和相关运算符的重载
6.自增自减运算符(++ --)的重载
因为内置类型的++ --分为前置类型和后置类型,所以,重载++和--时,也要区分前置和后置类型,而且,因为++和--会更改对象的状态,所以,应该把++和--定义为成员函数
为了和内置类型的++和--保持一致,前置++ --运算符应该返回对象类型的引用(直接得到++ --运算符后的对象),而后置++ --类型应该返回对象的副本(获得++ --运算符之前的对象或者值)
因为前置和后置的++和--的函数名都是operator++或者operator--,无法区分前置和后置的版本,所以,为了区分前置和后置的++--的版本,需要在后置版本的形参列表中加个int形参,该int形参的作用就是区分++和--的前置后置版本,不参与运算
fraction类的++和--的实现代码及测试如下
fraction &fraction::operator++()
{cout<<"operator++()"<<endl;this->numerator_+=this->denominator_;return *this;
}fraction &fraction::operator--()
{cout<<"operator--()"<<endl;this->numerator_-=this->denominator_;return *this;
}fraction fraction::operator++(int)
{cout<<"operator++(int)"<<endl;fraction t(*this);++*this;return t;
}fraction fraction::operator--(int)
{cout<<"operator--(int)"<<endl;fraction t(*this);--*this;return t;
}int main(int argc, char const *argv[])
{fraction t1(10,20),t2(-5,-10), t3(15,20), t4(-1, 30);cout<<--t1<<endl;cout<<++t2<<endl;cout<<t3--<<endl;cout<<t4++<<endl;return 0;
}
运算结果正确,测试OK
上述代码中后置类型的++ --会依靠前置的++ --来实现
7.函数调用运算符的重载
如果一个类定义了函数调用运算符,那么就可以像调用函数一样使用该类的对象,这样类的对象也叫函数对象,函数调用运算符必须是成员函数,因为是和类绑定的。函数对象的返回值和形参没有硬性规则。函数调用运算符主要是用在一些需要传入函数对象实参的容器、泛型算法等
在分数类fraction中,定义了一种求取分数倒数的函数调用运算符。
fraction fraction::operator()(const fraction ¶)
{cout<<__func__<<endl;fraction t;t.numerator_=para.denominator_;t.denominator_=para.numerator_;cout<<t<<endl;return t;
}int main(int argc, char const *argv[])
{fraction t1(10,20),t2(-5,-10), t3(15,20), t4(-1, 30);std::vector<fraction> vf;vf.push_back(t1);vf.push_back(t2);vf.push_back(t3);vf.push_back(t4);fraction func;for_each(vf.begin(), vf.end(), func);return 0;
}
输出结果正确,测试OK
注意,一定要使用类的对象来调用operator(),不能用类名来调用operator(),否则将调用拷贝构造函数...
8.类型转换运算符的重载
类型转换运算符很特殊,可以把一个类转换为除了void之外的任意类型
函数格式如下
operator type() const
type表示某种类型,该函数没有返回值,也没有形参,通常,一个类转为bool较为常见,而在调用类型转换运算符时,有可能出现隐式类型转化,所以,通常在在函数声明时,在函数名前面加explicit。
在fraction类中,类型转换运算符用来判断分数是否有效
fraction::operator bool() const
{cout<<__func__<<endl;return this->denominator_==0;
}int main(int argc, char const *argv[])
{fraction t1(10,20),t2(1,0);cout<<bool(t1)<<endl;cout<<bool(t2)<<endl;return 0;
}
不要过度使用类型转换运算符。
至此,分数类fraction实现完了,完整代码见https://gitee.com/cuijidan/myfraction
参考
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
C++知识点41——运算符的重载概念与分数类实现(下)相关推荐
- C++知识点39——运算符的重载概念与分数类实现(上)
一.概念 在博客https://blog.csdn.net/Master_Cui/article/details/109461561已经提到了赋值运算符的重载,重载运算符是有特殊名字的函数:名字由op ...
- C++知识点40——运算符的重载概念与分数类实现(中)
接上篇文章https://blog.csdn.net/Master_Cui/article/details/109515376,继续实现分数类和相关运算符的重载 3.重载算术运算符和复合赋值运算符 算 ...
- C++知识点43——解引用运算符和箭头运算符的重载及智能指针类的实现
一.概念. 在自定义行为类似指针的类时,需要重载*和->.C++中的智能指针就重载了这两个运算符.->必须是成员函数,*也应该是成员函数.与内置类型保持一致,这两个函数通常都是const的 ...
- 第十三周项目一-分数类中的运算符重载
/**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年5月25日*版 本 号:v1. ...
- 程序设计实习MOOC/自增和自减运算符的重载
自增和自减运算符的重载 问题 编写CDemo类,使得下面程序可以正常运行 int main(){CDemo d(5);cout << (d++) << "," ...
- C 流插入和流提取运算符的重载
<<运算符的重载 C 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 提出问题: 那这条语句为什么能成立呢? ...
- 8-3 实现分数类中的运算符重载
/* * 作 者: 霍雨佳 * 完成日期:2014 年4月15日 * 版 本 号:v1.0 * 问题描述:实现分数类中的运算符重载 * 样例输入: * 样例输出: * 项目要求:实现分数类中的运算符重 ...
- C++细节 输出运算符的重载为什么不写成类的成员函数
打印类中的一些变量,此时就需要使用函数或者重载,为了提高代码可读性,一般使用操作符重载来书写,而cout并不在c++的默认类成员函数中,需要我们自己书写.第一种写在类中如下面的代码(我们以日期类举例, ...
- [C++]分数类的定义(成员函数、运算符重载)
[C++]分数类的定义(成员函数.运算符重载) 1 分数类成员和成员函数 1.1 分数类成员 1.2 分数类的成员函数 1.3 分数类的io操作 1.4 分数类的预定义 2 成员函数定义 2.1 化简 ...
最新文章
- 针对IT人员的四月热点新书推荐
- WPF WindowStyle为None
- python3生成一个定长列表_range方法在Python2和Python3中的不同
- 【转】LUA内存分析
- 替换url中的参数值
- C语言之去掉https链接的默认443端口
- 冒泡排序的双重循环理解
- 如何实现Activiti的分支条件的自定义配置(转)
- VS各种工程文件说明
- webStorm部分以及重要快捷键
- 开源视频质量评价工具: IQA
- mac安装JDK及maven
- MYsql源码及其剖析
- 【图像特征提取】基于matlab脉冲耦合神经网络(PCNN)图像特征提取【含Matlab源码 1868期】
- idea导入项目出现乱码
- Java算法——地图单点坐标判断是否存在于某个区域
- java数据流编辑 kylo,Kylo的安装
- c语言判断不是大写字母,c语言isupper()函数如何判断字符是否为大写英文字母实例...
- idea 行号栏太宽以及显示一些图标问题解决
- JS 获取当前浏览器版本,验证浏览器版本是否高于谷歌80