C++ 重载 = 运算符

标签 c++ operator-overloading compiler-errors constants

我不确定为什么在尝试重载 = 运算符时会出现以下错误

error: passing ‘const MyCircle’ as ‘this’ argument of ‘double MyCircle::getRadius()’ discards qualifiers|

代码:

#include <iostream>

#define PI 3.14

using namespace std;


class MyCircle
{
  public:
    MyCircle();
    MyCircle(int r);
    MyCircle(const MyCircle& c);
    void setRadius(double r);
    double getRadius();
    double getArea();
    static void increaseInstanceCount();
    static int getInstanceCount();
    MyCircle operator=(const MyCircle &);

  private:
    double radius;
    static int instanceCount;
};

int MyCircle::instanceCount = 0;

/**
1. A default constructor, that sets the radius to 0
**/
MyCircle::MyCircle()
{
    radius = 0.0;
    increaseInstanceCount();
}

/**
2. A one argument costructor that accepts an int and uses it to initialize the radius
**/
MyCircle::MyCircle(int r)
{
    radius = r;
    increaseInstanceCount();
}

/**
3. A copy constructor that accepts a Circle reference as an argument, and uses it to initialize radius
**/
MyCircle::MyCircle(const MyCircle& c)
{
    radius = c.radius;
    increaseInstanceCount();
}

void MyCircle::increaseInstanceCount()
{
    instanceCount++;
}

int MyCircle::getInstanceCount()
{
    return instanceCount;
}
void MyCircle::setRadius(double r)
{
    radius = r;
}

double MyCircle::getRadius()
{
    return radius;
}

double MyCircle::getArea()
{
    return (radius * radius) * PI;
}

//overload = operator
MyCircle MyCircle::operator=(const MyCircle &rhs)
{
    if(this == &rhs)
        return *this;

    radius = rhs.getRadius();
    return *this;

}

int main()
{
    MyCircle circle;
    circle.setRadius(5.4);
    MyCircle circle2;
    circle2.setRadius(3.0);
    MyCircle circle3;
    circle3.setRadius(343.3);

    cout << "Total instances: " << circle.getInstanceCount() << endl;
    return 0;
}

最佳答案

你需要给 getRadius() 方法添加一个 const 限定符,比如

double MyCircle::getRadius() const
{
    return radius;
}

这将限定要使用 const 对象调用的方法。您可能希望将此限定符添加到任何不更改成员变量的方法,以避免此类错误。

关于C++ 重载 = 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5811933/

相关文章:

c++ - 以简单的方式处理异常语法问题

c# - IP 多播 : How do I know someone is subscribed?

c++ - 实现与 <<? 一起使用的有界字符串格式化运算符的有效方法

c++ - 全局运算符和成员运算符的区别

python - Python 中的魔术方法(dunders)与 C++ 中的运算符重载相同吗?

ios - 初始化程序不会在 swift 中从其父类(super class)错误中覆盖设计的初始化程序

c++ - 在头文件中声明和初始化常量

gcc - GCC 中向量类型 __m128、__m256 的重载冲突

c++ - 具有引用模板参数的部分特化无法在 VS2005 中编译

c - 在 Solaris 上编译 ruby​​ 1.9.3 时出错