2014-01-29 40 views
1

我有这个类的定义:如果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; 
    } 

} 

当我写在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反之亦然?
+1

让'operator +'返回一些具有相关信息的任意类型的对象,并且仅为该类型重载'operator ='。 – 0x499602D2

+4

如果第二个操作数丢失,你的代码看起来像'c = a +;',对吧?这根本不会编译。 –

+0

你能更具体吗?用代码示例? @ 0x499602D2 – MinimalTech

回答

2

你快到了。由于它是一个成员函数,所以第一个操作数是*this,所以用this->aa替换FIRST_OPERAND.a

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

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

而且,最好不要返回一个const值作为防止返回值移动。

0

它是编译器检查程序的语法正确性。这是无法辨别是否真的想写

c = a; 

就是做任务,或者你想写

c = a + b; 

的两个语句是正确的。

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

+0

谢谢您的帮助,我之前提出了错误的问题... – MinimalTech

0

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

如果您不想使用赋值操作符 - 隐藏它。例如。通过与private访问修饰符一起实现。

+0

感谢您的帮助,我之前提出了错误的问题... – MinimalTech

相关问题