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抱歉,我不是这个意思!!让我纠正一下。。。