C++ 如果第二个操作数为+;运算符重载在C+中为零+;?

C++ 如果第二个操作数为+;运算符重载在C+中为零+;?,c++,operators,operator-overloading,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. }; 此外,我还为“+”运算符

我有这样一个类定义:

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

}
  • Η如果第二个操作数为零,我如何
    返回第一个操作数的值,反之亦然

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

    c = a;
    
    c = a + b;
    
    那是做作业还是你想写

    c = a;
    
    c = a + b;
    
    这两种说法都是正确的


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

    对于您的行
    c=a赋值运算符由编译器实现(只是简单地复制对象内存)。
    这就是代码编译时“不使用第二个操作数”的原因


    如果希望禁止使用赋值运算符-隐藏它。例如,通过使用
    private
    access修饰符实现。

    您就快到了。因为它是一个成员函数,所以第一个操作数是
    *this
    ,所以将
    第一个操作数.a
    替换为
    this->a
    ,或者只替换
    a

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


    另外,最好不要返回
    常量
    值,因为这会阻止从返回值移动。

    操作符+
    返回具有相关信息的任意类型的对象,并仅重载该类型的
    操作符=
    。如果缺少第二个操作数,您的代码看起来像
    c=a+,对吗?那根本无法编译。你能更具体一点吗?用一个代码示例@0x499602D2将永远不会缺少
    运算符+()
    的第二个操作数。它从不涉及表达式
    c=a。在这种情况下,将使用默认生成的赋值。@OliCharlesworth抱歉,我不是这个意思!!让我纠正一下。。。