接上篇文章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 &para)
{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——运算符的重载概念与分数类实现(下)相关推荐

  1. C++知识点39——运算符的重载概念与分数类实现(上)

    一.概念 在博客https://blog.csdn.net/Master_Cui/article/details/109461561已经提到了赋值运算符的重载,重载运算符是有特殊名字的函数:名字由op ...

  2. C++知识点40——运算符的重载概念与分数类实现(中)

    接上篇文章https://blog.csdn.net/Master_Cui/article/details/109515376,继续实现分数类和相关运算符的重载 3.重载算术运算符和复合赋值运算符 算 ...

  3. C++知识点43——解引用运算符和箭头运算符的重载及智能指针类的实现

    一.概念. 在自定义行为类似指针的类时,需要重载*和->.C++中的智能指针就重载了这两个运算符.->必须是成员函数,*也应该是成员函数.与内置类型保持一致,这两个函数通常都是const的 ...

  4. 第十三周项目一-分数类中的运算符重载

    /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年5月25日*版 本 号:v1. ...

  5. 程序设计实习MOOC/自增和自减运算符的重载

    自增和自减运算符的重载 问题 编写CDemo类,使得下面程序可以正常运行 int main(){CDemo d(5);cout << (d++) << "," ...

  6. C 流插入和流提取运算符的重载

    <<运算符的重载 C 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 提出问题: 那这条语句为什么能成立呢? ...

  7. 8-3 实现分数类中的运算符重载

    /* * 作 者: 霍雨佳 * 完成日期:2014 年4月15日 * 版 本 号:v1.0 * 问题描述:实现分数类中的运算符重载 * 样例输入: * 样例输出: * 项目要求:实现分数类中的运算符重 ...

  8. C++细节 输出运算符的重载为什么不写成类的成员函数

    打印类中的一些变量,此时就需要使用函数或者重载,为了提高代码可读性,一般使用操作符重载来书写,而cout并不在c++的默认类成员函数中,需要我们自己书写.第一种写在类中如下面的代码(我们以日期类举例, ...

  9. [C++]分数类的定义(成员函数、运算符重载)

    [C++]分数类的定义(成员函数.运算符重载) 1 分数类成员和成员函数 1.1 分数类成员 1.2 分数类的成员函数 1.3 分数类的io操作 1.4 分数类的预定义 2 成员函数定义 2.1 化简 ...

最新文章

  1. 针对IT人员的四月热点新书推荐
  2. WPF WindowStyle为None
  3. python3生成一个定长列表_range方法在Python2和Python3中的不同
  4. 【转】LUA内存分析
  5. 替换url中的参数值
  6. C语言之去掉https链接的默认443端口
  7. 冒泡排序的双重循环理解
  8. 如何实现Activiti的分支条件的自定义配置(转)
  9. VS各种工程文件说明
  10. webStorm部分以及重要快捷键
  11. 开源视频质量评价工具: IQA
  12. mac安装JDK及maven
  13. MYsql源码及其剖析
  14. 【图像特征提取】基于matlab脉冲耦合神经网络(PCNN)图像特征提取【含Matlab源码 1868期】
  15. idea导入项目出现乱码
  16. Java算法——地图单点坐标判断是否存在于某个区域
  17. java数据流编辑 kylo,Kylo的安装
  18. c语言判断不是大写字母,c语言isupper()函数如何判断字符是否为大写英文字母实例...
  19. idea 行号栏太宽以及显示一些图标问题解决
  20. JS 获取当前浏览器版本,验证浏览器版本是否高于谷歌80

热门文章

  1. 使用eclipse生成javadoc的方法
  2. 工具栏对象GUI Status 与GUI Title
  3. BW:Start Routine
  4. ASP.NET 文件操作实例
  5. Asp.Net 上传大文件
  6. Ctrl+E快捷键,一键批量解决Excel中90%的问题!
  7. scrapy基础知识之 parse()方法的工作机制思考:
  8. 剑指Offer 替换空格
  9. makeMtk- user 版本编译
  10. jquery 插件