【问题标题】:operator= in c++ (11) working directionc++中的operator=(11)工作方向
【发布时间】:2013-08-16 04:12:38
【问题描述】:

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

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

我可以吗?如果是,怎么做?

【问题讨论】:

  • 您是向我们展示整个课程还是只展示部分课程?如果是全部,您需要定义一个接受 2 个双精度的构造函数,而不是赋值运算符来编译您的示例。此外,典型的 operator= 实现返回对同一类实例的引用,而不是对输入参数的引用。
  • 我想你在找operator double
  • 谢谢!!我不知道存在操作员双重...谢谢!那么......我可以重载“所有”类型的运算符吗?我不知道谢谢所有的答案!

标签: c++ c++11 operator-overloading


【解决方案1】:

您不需要为此目的使用赋值运算符 - 您应该重载转换运算符;例如

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 分配给有理数,这样的操作没有明确的含义。但是,您可能希望提供用于分配 int 的帮助器,例如,除了通常用于分配另一个有理数的帮助器:

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

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

【讨论】:

  • 谢谢,如果没有老师,很难找到操作员的工作方式……这对我很有用谢谢!
  • @user2688108 这个答案足够了吗?如果是,请考虑接受。
【解决方案2】:

这里我认为user-defined conversion 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;
}

【讨论】:

  • 谢谢!我重复一遍!谢谢!这就是我想要达到的目标
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2012-03-13
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多