经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
c/c++ 重载运算符 基本概念
来源:cnblogs  作者:小石王  时间:2018/12/17 9:47:33  对本文有异议

重载运算符 基本概念

问题:对于int,float可以进行算数运算,但是对于一个自定义的类的对象进行算术运算,就不知道具体怎么运算了。

所以有了自定义运算符的概念。

1,自定义运算符其实就是一个以operator开头的函数,它可以是:

  • 一个类的成员函数
  • 普通的非函数

2,有一元运算符,比如++,还有元运算符,比如+。

  • 自定义运算符函数为类的成员函数:二元运算符(a1 + b1)的左侧的对象(a1),绑定到隐式的this指针上;二元运算符的右侧的对象(b1),绑定到operator函数的第一个参数上。

    1. a1 + b1;
    2. a1.operator+(b1);
    3. string s = "aa";
    4. string b = a + "dd";//实际调用的是a.operator+("dd");
    5. string a = "b" + s;//实际调用的是operator+("b", s);因为"b"是const char*,所以它没有成员方法operator+
  • 自定义运算符函数为普通的非函数:二元运算符(a1 + b1)的左侧的对象(a1),绑定到operator函数的第一个参数上;二元运算符的右侧的对象(b1),绑定到operator函数的第二个参数上。

    1. a1 + b1;
    2. operator+(a1, b1);
    3. string s = "aa";
    4. string a = "b" + s;//实际调用的是operator+("b", s);因为"b"是const char*,所以它没有成员方法

3,例子(重载的输入,输出,+,+=)

sample.h

  1. #ifndef CP5_CH14_EX14_02_H
  2. #define CP5_CH14_EX14_02_H
  3. #include <string>
  4. #include <iostream>
  5. class Sales_data{
  6. friend std::istream& operator>>(std::istream&, Sales_data&);
  7. friend std::ostream& operator<<(std::ostream&, const Sales_data&);
  8. friend Sales_data operator+(const Sales_data&, const Sales_data&);
  9. public:
  10. Sales_data(const std::string& s, unsigned n, double p):
  11. bookNo(s), units_sold(n), revenue(p){}
  12. Sales_data():Sales_data("",0, 0.0f){}
  13. Sales_data(std::istream&);
  14. Sales_data& operator+=(const Sales_data&);
  15. std::string isbn() const {return bookNo;}
  16. private:
  17. inline double avg_price() const;
  18. std::string bookNo;
  19. unsigned units_sold = 0;
  20. double revenue = 0.0;
  21. };
  22. std::istream& operator>>(std::istream&, Sales_data&);
  23. std::ostream& operator<<(std::ostream&, const Sales_data&);
  24. Sales_data operator+(const Sales_data&, const Sales_data&);
  25. inline double Sales_data::avg_price() const {
  26. return units_sold ? revenue / units_sold : 0;
  27. }
  28. #endif // CP5_CH14_EX14_02_H

sample.cpp

  1. #include "sales.hpp"
  2. Sales_data::Sales_data(std::istream& is) : Sales_data(){
  3. is >> *this;
  4. }
  5. std::istream& operator>>(std::istream& is, Sales_data& item){
  6. double price = 0.0;
  7. is >> item.bookNo >> item.units_sold >> price;
  8. if(is){
  9. item.revenue = item.units_sold * price;
  10. }
  11. else{
  12. item = Sales_data();
  13. }
  14. return is;
  15. }
  16. std::ostream& operator<<(std::ostream& os, const Sales_data& item){
  17. os << item.bookNo << ":" << item.units_sold << " " <<
  18. item.revenue << " " << item.avg_price();
  19. return os;
  20. }
  21. Sales_data operator+(const Sales_data& s1, const Sales_data& s2){
  22. Sales_data da = s1;
  23. da += s2;
  24. return da;
  25. }
  26. Sales_data& Sales_data::operator+=(const Sales_data& rhs){
  27. units_sold += rhs.units_sold;
  28. revenue += rhs.revenue;
  29. return *this;
  30. }
  31. int main(){
  32. Sales_data s1(std::cin);
  33. std::string bn("aa");
  34. Sales_data s2(bn, 10, 5.2);
  35. Sales_data s3 = s1 + s2;
  36. std::cout << s3 << std::endl;
  37. }

当重载输入运算符时,应该处理输入错误的情况。

如果类同时定义算术运算符和相应的复合运算符,则通常使用复合运算符来实现算术运算符。

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号