运算符重载(*,+, - ,/,=)?

时间:2011-12-01 19:19:34

标签: c++ operator-overloading

我试图在FLOAT类中重载(*,+, - ,/,=)运算符。我写了这堂课:

class FLOAT{
private:
float x;
public:
FLOAT(){    x=0.0;  }
void setFloat(float f)      {   x=f;    }
void operator+(FLOAT obj)   {x=x+obj.x; };
void operator-(FLOAT obj)   {x=x-obj.x; };
void operator*(FLOAT obj)   {x=x*obj.x; };
void operator/(FLOAT obj)   {x=x/obj.x; };
FLOAT& operator=(const FLOAT& obj)  {this->x=obj.x; return *this;   };
};

我用它:

int main() {
FLOAT f,f2,f3;
f.setFloat(4);
f2.setFloat(5);

f3=f+f2;// here is the problem!
    system("pause");//to pause console screen
return 0;
}

f3=f+f2似乎不对。我该怎么办?

6 个答案:

答案 0 :(得分:8)

我认为你的运营商实现不会做你想要的。例如:

FLOAT f1; f1.setFloat(1.0);
FLOAT f2; f2.setFloat(2.0);
FLOAT f3;
f3 = f1 + f2;

假设您更改operator +(),例如,返回FLOAT,您仍然会产生这样的效果:在添加之后,f1和f3都将等于3.0;

常用的习惯用法是在类中实现像+ =这样的运算符,在类之外实现类似+的运算符。例如:

class FLOAT {...
    FLOAT& operator+=(const FLOAT& f)
    {
        x += f.x;
        return *this;
    }
};

...

FLOAT operator+(const FLOAT& f1, const FLOAT& f2)
{
    FLOAT result(f1);
    f1 += f2;
    return f1;
}

这样做的另一个好处是您还可以轻松添加其他运营商,例如

FLOAT operator+(int x, const FLOAT& f);
FLOAT operator+(double x, const FLOAT& f);

如果您想要使用更复杂的数字或矩阵等更有趣的类型来完成这项工作,那么对这样的类进行彻底的工作是很好的做法。请确保添加比较运算符,复制构造函数,析构函数和赋值运算符以确保完整性。祝你好运!

答案 1 :(得分:6)

您的运营商相当于+=-=等。 如果你想要+,你还需要返回一个值!

FLOAT operator+(FLOAT obj)
{
    FLOAT tmp;
    tmp.x = x+obj.x;
    return tmp;
}

答案 2 :(得分:5)

您无法将void函数的返回值赋给任何东西,因为它不会返回任何内容。声明操作符重载为友元函数通常更灵活。你的类和功能应该更像这样:

class FLOAT { 
    friend FLOAT operator+( const FLOAT & a, const FLOAT & b );

   /* ... rest of class ... */
};


FLOAT operator+( const FLOAT & a, const FLOAT & b ) 
{
    FLOAT temp( a );
    temp.x += b.x; 
    return temp;
}

答案 3 :(得分:4)

您应该在每种情况下返回结果。还通过引用传递参数,因此不会复制它并添加一些const限定符。对于+,它可能看起来像:

FLOAT operator+(const FLOAT& obj) const
{
    FLOAT res;
    res.x = x + obj.x;
    return res;
}

注意您可能不想返回const,因为您希望获得可修改的对象。

答案 4 :(得分:3)

void operator+(FLOAT obj)   {x=x+obj.x; };

此代码有什么问题?

它返回void,你想在某处分配它。不行。

FLOAT & FLOAT::operator=(const FLOAT &rhs) {
    ...  // todo assignment here
    return *this;  // Return a reference to myself.
}

FLOAT & FLOAT::operator+=(const FLOAT &rhs) {
   ...  //todo implement compound + operator
   return *this;  // Return a reference to myself.
  }

const FLOAT FLOAT::operator+(const FLOAT &rhs) const {
    return FLOAT(*this) += other; //that's already done :)
  }

答案 5 :(得分:1)

operator+的返回类型为void。它应该返回FLOAT

要通过示例澄清,void operator+(FLOAT obj) {x=x+obj.x; };应该更像FLOAT operator+(FLOAT obj) { return obj.x + x; }。这是因为,正如其他人所指出的,返回类型为void的函数不能返回任何值。由于operator+通常需要返回表示添加结果的值,因此应返回保存此结果的FLOAT对象。