运算符=在c++(11)工作方向上

operator= in c++ (11) working direction

本文关键字:工作 方向 c++ 运算符      更新时间:2023-10-16

我正在为我的Project做一个Little rational类,我重载了所有的算术运算符。好吧,当我试图重载运算符=我有一个小,现在我不知道是我的问题(我不知道它是如何工作的)还是我写的代码的问题(写得不好)以下是代码:

class rational{
   public:
      double& operator=(double& d){
         d= this->num/this->den;
         return d;
      }
      double& operator=(rational& r){
            double d= r.num/r.den;
            return d;
      }
      double& operator=(){
            double d= this->num/this->den;
            return d;
      }
}

好吧,怎么了?什么是对的?(我认为一切都错了哈哈)

我的目标是做到这一点:

int main(){
    rational r(4, 5);
    double d= r;
}

我能做吗?如果是,如何?

您不需要用于此目的的赋值运算符,而是应该重载转换运算符;例如

class rational {
  private: 
    int num;
    int den; 
  public: 
    // ... 
    operator double() { return double(num) / double(den); }
};

这将允许

rational r(4, 5);
double d = double(r); // d = 0.8 

如果您希望更改现有对象的状态,则应使用赋值运算符。您可能不想允许将double赋值给rational,因为这样的操作并没有明确的含义。然而,您可能希望提供用于分配int的助手,例如,除了通常用于分配另一个rational的助手之外:

rational &operator=(const rational &rhs)
{
    num = rhs.num;
    den = rhs.den;
    return *this;
}
rational &operator=(int rhs)
{
    num = rhs;
    den = 1;
    return *this;
}

这里我认为用户定义的转换operator会更合适。

class rational {
public: 
    rational( int iNum, int iDen ) : num( iNum ), den( iDen ) {}
    // ... 
    operator double() { return (double)num / (double)den; }
private: 
    int num;
    int den;
};
int main()
{
    rational r( 1, 2 );
    double n = r;
    std::cout << r << std::endl; // output 0.5
    return 0;
}

下面是一个小的例子来说明这一点:http://ideone.com/I0Oj66


关于复制分配operator=:

T的复制赋值运算符是一个名为operator=的非模板非静态成员函数,它只接受一个类型为T的参数。

operator=用于更改现有对象。

例如,您可以使用它来复制另一个对象的状态:

rational &operator=( const rational &rhs )
{
    num = rhs.num;
    den = rhs.den;
    return *this;
}