如果在C ++中+运算符重载的第二个操作数为零,如何返回第一个操作数?

时间:2014-01-29 18:19:04

标签: c++ operators operator-overloading

我有这个类定义:

class foo{

public:
    foo();
    foo(const int& var);
    foo(const foo& var);
    ~foo();

    const foo operator +(const foo& secondOp) const;

private:
    int a;
    //plus other values, pointers, e.t.c.

};

我也为'+'运算符重载做了这个实现:

const foo foo::operator +(const foo& secondOp) const{

    //I want here to check if i have one operand or two...
    if ((FIRST_OPERAND.a!=0) && (secondOp.a==0)){
        cout << "ERROR, second operand is zero";
        return FIRST_OPERAND;
    }
    else if ((FIRST_OPERAND.a==0) && (secondOp.a!=0)){
        cout << "ERROR, first operand is zero";
        return secondOp;
    }

}

当我写main()时:

foo a(2);
foo b;
foo c;

//I want here to print the ERROR and
//return only the values of a
c = a + b;
  1. 如果第二个操作数为零,我可以return第一个操作数的值,反之亦然?

3 个答案:

答案 0 :(得分:2)

你快到了。由于它是成员函数,因此第一个操作数为*this,因此将FIRST_OPERAND.a替换为this->a或仅a

但是,最好使其成为非成员函数,以允许在两个操作数上进行转换(即能够编写a + 22 + a)。它需要成为朋友才能访问私人会员。

friend foo operator +(const foo& firstOp, const foo& secondOp);

此外,最好不要返回const值,因为这会阻止从返回值移动。

答案 1 :(得分:0)

编译器检查程序的语法正确性。它无法区分你是否确实想写

c = a;

即做作业或你想写作

c = a + b;

这两个陈述都是正确的。

这是一个所谓的逻辑错误。编译器无法看到我们的想法。

答案 2 :(得分:0)

对于你的行c = a;赋值运算符由编译器实现(只是浅层复制对象内存)。 这就是你的代码编译“没有第二个操作数”的原因。

如果您不允许使用赋值运算符 - 隐藏它。例如。通过使用private访问修饰符实现。