C++ 运算符=在c+中+;(11) 工作方向

C++ 运算符=在c+中+;(11) 工作方向,c++,c++11,operator-overloading,C++,C++11,Operator Overloading,我正在为我的项目做一个小的rational类,我重载了所有算术运算符。嗯,当我试图重载operator=时,我有一点,现在我不知道是我的问题(我不知道它是如何工作的)还是我的wroten代码的问题(我写得不好),代码如下: class rational{ public: double& operator=(double& d){ d= this->num/this->den; return d; }

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

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;
}

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

您不需要为此目的使用赋值运算符-而是应该重载转换运算符;e、 g

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;
}

您不需要为此目的使用赋值运算符-而是应该重载转换运算符;e、 g

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;
}
在这里,我认为a更合适

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;
}
在这里,我认为a更合适

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;
}

你是给我们看全班还是只看一部分?如果是这样的话,您需要定义一个接受2个双精度的构造函数,而不是赋值运算符来编译示例。另外,典型的
operator=
实现返回对同一类实例的引用,而不是对输入参数的引用。我认为您正在寻找
operator double
。谢谢!!我不知道那是什么…谢谢!然后我可以重载“所有”类型运算符吗?我不知道,谢谢你的回答!你是给我们看全班还是只看一部分?如果是这样的话,您需要定义一个接受2个双精度的构造函数,而不是赋值运算符来编译示例。另外,典型的
operator=
实现返回对同一类实例的引用,而不是对输入参数的引用。我认为您正在寻找
operator double
。谢谢!!我不知道那是什么…谢谢!然后我可以重载“所有”类型运算符吗?我不知道,谢谢你的回答!谢谢,如果你没有老师的话,很难找到操作符是如何工作的。。。这对我很有用,谢谢@user2688108这个答案足够吗?如果是这样,请考虑接受它。谢谢,如果你没有任何老师,找到运营商是很困难的。这对我很有用,谢谢@user2688108这个答案足够吗?如果是的话,请考虑接受。谢谢!我重复一遍!谢谢这就是我想要实现的目标!我重复一遍!谢谢这就是我想要实现的目标