当前位置:   article > 正文

C++运算符重载_++运算符 重载

++运算符 重载

        运算符号重载实际上是通过函数实现,通过创建 operator 函数就可以实现重
载运算符

运算符重载语法:

  1. 返回值类型 类名::operator+(参数) //返回值类型一般是这个类的名字 +是重载的运算符号
  2. {
  3. //具体代码
  4. }

复数加法示例代码:

  1. #include <iostream>//实现复数的加法
  2. class Complex
  3. {
  4. public:
  5. Complex(); //构造函数
  6. Complex(double r, double i); //构造函数 重构
  7. Complex operator+(Complex &d); //方法
  8. void printf();
  9. private:
  10. double real; //属性
  11. double imag;
  12. };
  13. Complex::Complex()
  14. {
  15. /*
  16. real = 0;
  17. imag = 0;
  18. */
  19. }
  20. Complex::Complex(double r, double i)
  21. {
  22. real = r;
  23. imag = i;
  24. }
  25. Complex Complex::operator+(Complex &d)
  26. {
  27. Complex c;
  28. c.real = real + d.real;
  29. c.imag = imag + d.imag;
  30. return c;
  31. }
  32. void Complex::printf()
  33. {
  34. std::cout << "(" << real << "," << imag << "i)\n";
  35. }
  36. int main()
  37. {
  38. Complex c1(3, 4), c2(5, -10), c3;
  39. c3 = c1 + c2;
  40. std::cout << "c1 = ";
  41. c1.printf();
  42. std::cout << "c2 = ";
  43. c2.printf();
  44. std::cout << "c1 + c2 = ";
  45. c3.printf();
  46. return 0;
  47. }

运行结果:

例子中的c1+c2,编译系统把他解释为c1.operator+(c2)

即通过对象c1调用运算符重载函数,并以表达式中第二个参数(运算符右侧的类对象c2)z作为函数的实参

分数加减乘除重载:

  1. #include<iostream>//运算符重载2 课后作业
  2. #include<string>
  3. #include<stdlib.h>
  4. class Rational
  5. {
  6. public:
  7. Rational(int num, int denom);//num=分子 ,denom=分母
  8. Rational operator+(Rational rhs);
  9. Rational operator-(Rational rhs);
  10. Rational operator*(Rational rhs);
  11. Rational operator/(Rational rhs);
  12. void printf();
  13. private:
  14. void normalize();//负责对分数的简化处理
  15. int numerator; //分子
  16. int denominator;//分母
  17. };
  18. Rational::Rational(int num, int denom)
  19. {
  20. numerator = num;
  21. denominator = denom;
  22. normalize();
  23. }
  24. //normalize()对分数进行简化操作包括:
  25. //1、只允许分子为负数,如果分母为负数则把负数挪到分子部分,如1/-2 == -1/2
  26. //2、利用欧几里德算法(辗转求余原理)将分数进行简化:2/10 =1/5
  27. void Rational::normalize()
  28. {
  29. //确保分母为正
  30. if (denominator < 0)
  31. {
  32. numerator = -numerator;
  33. denominator = -denominator;
  34. }
  35. //欧几里德算法
  36. int a = abs(numerator);
  37. int b = abs(denominator);
  38. //求出最大公约数
  39. while (b > 0)
  40. {
  41. int t = a%b;
  42. a = b;
  43. b = t;
  44. }
  45. //分子、分母分别➗最大公约数得到最简化分数
  46. numerator /= a;
  47. denominator /= a;
  48. }
  49. // a c a*d c*b a*d + c*b
  50. // - + - = --- + --- = ----------
  51. // b d b*d b*d b*d
  52. Rational Rational::operator+(Rational rhs)
  53. {
  54. int a = numerator;
  55. int b = denominator;
  56. int c = rhs.numerator;
  57. int d = rhs.denominator;
  58. int e = a*b + c*d;
  59. int f = b*d;
  60. return Rational(e,f);
  61. }
  62. // a c a -c
  63. // - - - = - + ---
  64. // b d b d
  65. Rational Rational::operator-(Rational rhs)
  66. {
  67. rhs.numerator = -rhs.numerator;
  68. return operator+(rhs);
  69. }
  70. // a c a*d
  71. // - * - = ---
  72. // b d b*d
  73. Rational Rational::operator*(Rational rhs)
  74. {
  75. int a = numerator;
  76. int b = denominator;
  77. int c = rhs.numerator;
  78. int d = rhs.denominator;
  79. int e = a*c;
  80. int f = b*d;
  81. return Rational(e,f);
  82. }
  83. // a c a d
  84. // - / - = - * -
  85. // b d b c
  86. Rational Rational::operator/(Rational rhs)
  87. {
  88. int t = rhs.numerator;
  89. rhs.numerator = rhs.denominator;
  90. rhs.denominator = t;
  91. return operator*(rhs);
  92. }
  93. void Rational::printf()
  94. {
  95. if (numerator%denominator == 0)
  96. std::cout << numerator / denominator;
  97. else
  98. std::cout << numerator << "/" << denominator;
  99. }
  100. int main()
  101. {
  102. Rational f1(2, 16);
  103. Rational f2(7, 8);
  104. //测试有理数加法
  105. Rational res = f1 + f2;
  106. f1.printf();
  107. std::cout << "+";
  108. f2.printf();
  109. std::cout << "=";
  110. res.printf();
  111. std::cout << "\n";
  112. //测试有理数减法
  113. res = f1 - f2;
  114. f1.printf();
  115. std::cout << '-';
  116. f2.printf();
  117. std::cout << '=';
  118. res.printf();
  119. std::cout << "\n";
  120. //测试有理数乘法
  121. res = f1 * f2;
  122. f1.printf();
  123. std::cout << "*";
  124. f2.printf();
  125. std::cout << "=";
  126. res.printf();
  127. std::cout << "\n";
  128. //测试有理数除法
  129. res = f1 / f2;
  130. f1.printf();
  131. std::cout << '/';
  132. f2.printf();
  133. std::cout << '=';
  134. res.printf();
  135. std::cout << "\n";
  136. return 0;
  137. }

运行结果:

重载需要注意的一些规则:

  • 重载不能改变运算符运算对象(操作数)个数
  • 重载不能改变运算符的优先级别
  • 重载不能改变运算符的结合性
  • 重载运算符的函数不能又默认参数
  • 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个应该是类对象或者类对象的引用,(也就是说,参数不能全部都是C++的标准类型,这样约定是为了防止用户修改用于标准类型结构的运算符性质)
  • C++不允许用户定义新的运算符,只能对已有的C++运算符进行重载
  • 以下5个运算符不允许重载
    .成员访问运算符
    .*成员指针访问运算符
    ::域运算符
    sizeof尺寸运算符
    ?:条件运算符

 详细参考小甲鱼视频[25]运算符重载_哔哩哔哩_bilibili

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/51673
推荐阅读
相关标签
  

闽ICP备14008679号