鱼C论坛

 找回密码
 立即注册
查看: 1503|回复: 2

C++运算符重载

[复制链接]
发表于 2019-11-16 22:39:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 bin554385863 于 2019-11-16 23:03 编辑
  1. #include <iostream>
  2. class Circle
  3. {
  4. private:
  5.     double Radius; //半径
  6. public:
  7.     static const double PI;
  8.     Circle(double r = 0) : Radius(r) //构造函数
  9.     {
  10.     }
  11.     Circle(Circle &circle) //赋值构造
  12.     {
  13.         this->Radius = circle.Radius;
  14.     }
  15.     void setCircleRadius(double r) //设置半径
  16.     {
  17.         Radius = r;
  18.     }
  19.     double getCircleRadius() //获取半径
  20.     {
  21.         return Radius;
  22.     }
  23.     double getCirclePerimeter() //获取周长
  24.     {
  25.         return 2 * PI * Radius;
  26.     }
  27.     double getCircleArea() //获取面积
  28.     {
  29.         return PI * Radius * Radius;
  30.     }
  31.     /*扩大倍数*/
  32.     Circle &operator*(int n)
  33.     {
  34.         this->Radius = this->Radius * n;
  35.         return *this;
  36.     }
  37.     friend std::ostream &operator<<(std::ostream &os, Circle &circle) //重载<<运算符
  38.     {
  39.         os << "CircleRadius: " << circle.Radius << "\n"
  40.            << "CirclePerimeter: " << circle.getCirclePerimeter() << "\n"
  41.            << "CircleArea: " << circle.getCircleArea() << std::endl;
  42.         return os;
  43.     }
  44.     ~Circle() {}
  45. };
  46. double const Circle::PI = 3.141592653;
  47. int main(int argc, char const *argv[])
  48. {
  49.     Circle circle, ncircle;
  50.     std::cout << circle << std::endl;
  51.     circle.setCircleRadius(10);
  52.     std::cout << circle << std::endl;
  53.     ncircle = circle * 2;
  54.     std::cout << ncircle;
  55.     return 0;
  56. }
复制代码

-------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-q01elhji.d3w --stdout=Microsoft-MIEngine-Out-cvizs1af.xw1 --stderr=Microsoft-MIEngine-Error-i5s3bovj.1rj --pid=Microsoft-MIEngine-Pid-hxzv5xmu.hvn --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
CircleRadius: 0
CirclePerimeter: 0
CircleArea: 0

CircleRadius: 10
CirclePerimeter: 62.8319
CircleArea: 314.159

CircleRadius: 20
CirclePerimeter: 125.664
CircleArea: 1256.64


E:\Users\admin\Documents\VScode>  

----------------------------------------------------------------------------------------------------------
这是我写的一个简单求圆的周长和面积的类
第32行对*的重载使得ncircle = circle * 2成立, 怎么重载也让ncircle = 2*circle成立;
Circle &operator*(Circle &circle, int n)---总是报错参数过多


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-16 22:50:45 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-16 23:02 编辑


找到方法了
  1. /*扩大倍数*/
  2.     Circle &operator*(int n)
  3.     {
  4.         this->Radius = n*this->Radius;
  5.         return *this;
  6.     }
  7.     friend Circle operator*(int n, Circle &circle)
  8.     {
  9.         return circle*n;
  10.     }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-16 23:03:26 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-17 01:00 编辑
  1. #include <iostream>
  2. class Circle
  3. {
  4. private:
  5.     double Radius; //半径
  6. public:
  7.     static const double PI;
  8.     Circle(double r = 0) : Radius(r) //构造函数
  9.     {
  10.     }
  11.     Circle(const Circle &circle) //赋值构造
  12.     {
  13.         this->Radius = circle.Radius;
  14.     }
  15.     void setCircleRadius(double r) //设置半径
  16.     {
  17.         Radius = r;
  18.     }
  19.     double getCircleRadius() const //获取半径
  20.     {
  21.         return Radius;
  22.     }
  23.     double getCirclePerimeter() const //获取周长
  24.     {
  25.         return 2 * PI * Radius;
  26.     }
  27.     double getCircleArea() const//获取面积
  28.     {
  29.         return PI * Radius * Radius;
  30.     }
  31.     /*扩大倍数*/
  32.     Circle &operator*(int n)
  33.     {
  34.         static Circle circle;
  35.         circle.Radius = n*this->Radius;
  36.         return circle;
  37.     }
  38.     friend Circle operator*(int n, Circle &circle)
  39.     {
  40.         return circle*n;
  41.     }
  42.     friend std::ostream &operator<<(std::ostream &os, Circle &circle) //重载<<运算符
  43.     {
  44.         os << "CircleRadius: " << circle.Radius << "\n"
  45.            << "CirclePerimeter: " << circle.getCirclePerimeter() << "\n"
  46.            << "CircleArea: " << circle.getCircleArea() << std::endl;
  47.         return os;
  48.     }
  49.     ~Circle() {}
  50. };
  51. double const Circle::PI = 3.141592653;
  52. int main(int argc, char const *argv[])
  53. {
  54.     Circle circle0, circle1, circle2,circle3;
  55.     circle1.setCircleRadius(5);
  56.     circle2 = circle1*2;
  57.     circle3 = 5*circle2;
  58.     std::cout<<circle0<<std::endl;
  59.     std::cout<<circle1<<std::endl;
  60.     std::cout<<circle2<<std::endl;
  61.     std::cout<<circle3<<std::endl;
  62.     return 0;
  63. }

复制代码

------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-bq53flzb.pdd --stdout=Microsoft-MIEngine-Out-0ezshnul.zpd --stderr=Microsoft-MIEngine-Error-dzndlmdf.zut --pid=Microsoft-MIEngine-Pid-xianufj3.alm --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
CircleRadius: 0
CirclePerimeter: 0      
CircleArea: 0

CircleRadius: 5
CirclePerimeter: 31.4159
CircleArea: 78.5398

CircleRadius: 10
CirclePerimeter: 62.8319
CircleArea: 314.159

CircleRadius: 50
CirclePerimeter: 314.159
CircleArea: 7853.98



E:\Users\admin\Documents\VScode>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 16:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表