我有这个类定义:
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;
return
第一个操作数的值,反之亦然?答案 0 :(得分:2)
你快到了。由于它是成员函数,因此第一个操作数为*this
,因此将FIRST_OPERAND.a
替换为this->a
或仅a
。
但是,最好使其成为非成员函数,以允许在两个操作数上进行转换(即能够编写a + 2
或2 + a
)。它需要成为朋友才能访问私人会员。
friend foo operator +(const foo& firstOp, const foo& secondOp);
此外,最好不要返回const
值,因为这会阻止从返回值移动。
答案 1 :(得分:0)
编译器检查程序的语法正确性。它无法区分你是否确实想写
c = a;
即做作业或你想写作
c = a + b;
这两个陈述都是正确的。
这是一个所谓的逻辑错误。编译器无法看到我们的想法。
答案 2 :(得分:0)
对于你的行c = a;
赋值运算符由编译器实现(只是浅层复制对象内存)。
这就是你的代码编译“没有第二个操作数”的原因。
如果您不允许使用赋值运算符 - 隐藏它。例如。通过使用private
访问修饰符实现。