鱼C论坛

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

C++运算符重载

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

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

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

x
本帖最后由 bin554385863 于 2019-11-16 23:03 编辑
#include <iostream>
class Circle
{
private:
    double Radius; //半径
public:
    static const double PI;
    Circle(double r = 0) : Radius(r) //构造函数
    {
    }
    Circle(Circle &circle) //赋值构造
    {
        this->Radius = circle.Radius;
    }
    void setCircleRadius(double r) //设置半径
    {
        Radius = r;
    }
    double getCircleRadius() //获取半径
    {
        return Radius;
    }
    double getCirclePerimeter() //获取周长
    {
        return 2 * PI * Radius;
    }
    double getCircleArea() //获取面积
    {
        return PI * Radius * Radius;
    }
    /*扩大倍数*/
    Circle &operator*(int n)
    {
        this->Radius = this->Radius * n;
        return *this;
    }
    friend std::ostream &operator<<(std::ostream &os, Circle &circle) //重载<<运算符
    {
        os << "CircleRadius: " << circle.Radius << "\n"
           << "CirclePerimeter: " << circle.getCirclePerimeter() << "\n"
           << "CircleArea: " << circle.getCircleArea() << std::endl;
        return os;
    }
    ~Circle() {}
};
double const Circle::PI = 3.141592653;
int main(int argc, char const *argv[])
{
    Circle circle, ncircle;
    std::cout << circle << std::endl;
    circle.setCircleRadius(10);
    std::cout << circle << std::endl;
    ncircle = circle * 2;
    std::cout << ncircle;
    return 0;
}
-------------------------------------------------------------------------------------------------
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)---总是报错参数过多


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


找到方法了
/*扩大倍数*/
    Circle &operator*(int n)
    {
        this->Radius = n*this->Radius;
        return *this;
    }
    friend Circle operator*(int n, Circle &circle)
    {
        return circle*n;
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-16 23:03:26 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-17 01:00 编辑
#include <iostream>
class Circle
{
private:
    double Radius; //半径
public:
    static const double PI;
    Circle(double r = 0) : Radius(r) //构造函数
    {
    }
    Circle(const Circle &circle) //赋值构造
    {
        this->Radius = circle.Radius;
    }
    void setCircleRadius(double r) //设置半径
    {
        Radius = r;
    }
    double getCircleRadius() const //获取半径
    {
        return Radius;
    }
    double getCirclePerimeter() const //获取周长
    {
        return 2 * PI * Radius;
    }
    double getCircleArea() const//获取面积
    {
        return PI * Radius * Radius;
    }
    /*扩大倍数*/
    Circle &operator*(int n)
    {
        static Circle circle;
        circle.Radius = n*this->Radius;
        return circle;
    }
    friend Circle operator*(int n, Circle &circle)
    {
        return circle*n;
    }
    friend std::ostream &operator<<(std::ostream &os, Circle &circle) //重载<<运算符
    {
        os << "CircleRadius: " << circle.Radius << "\n"
           << "CirclePerimeter: " << circle.getCirclePerimeter() << "\n"
           << "CircleArea: " << circle.getCircleArea() << std::endl;
        return os;
    }
    ~Circle() {}
};
double const Circle::PI = 3.141592653;
int main(int argc, char const *argv[])
{
    Circle circle0, circle1, circle2,circle3;
    circle1.setCircleRadius(5);
    circle2 = circle1*2;
    circle3 = 5*circle2;
    std::cout<<circle0<<std::endl;
    std::cout<<circle1<<std::endl;
    std::cout<<circle2<<std::endl;
    std::cout<<circle3<<std::endl;
    return 0;
}
------------------------------------------------------------------------------
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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 13:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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