2016-04-26 31 views
0

以下代码是否适用于重载比较运算符?这段代码中是否有任何愚蠢的错误或循环漏洞?我特别怀疑if循环if (b1 == b2)if (&b1 == &b2)?我认为哪一个是正确的,最终通过引用权传递。如果我们在堆上分配对象,那么我们可以比较指针吗?该代码是否适用于重载比较运算符?

下面是代码:

#include <QCoreApplication> 
#include <iostream> 

using namespace std; 

class Base{ 
private: 
    //static const int i=10; 
    int j; 
    string str; 
public: 
    //void display() const; 
    //int read(); 
    bool operator==(const Base &rhs); 
}; 

bool Base::operator ==(const Base &rhs) 
{ 
    if((this->j == rhs.j) && (this->str == rhs.str)) 
     return true; 
    else 
     return false; 
} 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    Base b1, b2; 
    if(&b1 == &b2) // or if(b1 == b2) 
    { 
     cout << "Equal\n"; 
    } 
    else 
    { 
     cout << "Not equal\n"; 
    } 
    return a.exec(); 
} 

回答

4

此函数签名说给编译器对比操作员可以改变对象的值,所以不能const对象上调用。因此,这将是更好的将其声明为const:

bool operator==(const Base &rhs) const; 

在此代码,您将可以比较两个对象的地址:

if(&b1 == &b2) // or if(b1 == b2) 
{ 
    cout << "Equal\n"; 
} 
else 
{ 
    cout << "Not equal\n"; 
} 

他们显然是不相等的。如果(b1 == b2){...}正确,如果你想检查对象的平等。

如果我们在堆上分配对象,我们可以比较指针吗?

如果a和b是指针,你可以比较指针值:

*a == *b 

或调用operator ==明确(是什么丑陋):

a->operator==(*b) 

这是常见的C++宣布这样的运营商为朋友(但在你的情况下,它不是必需的)。此代码的内部使用也不会使可读性更好。我想看到这个操作符为:

bool Base::operator == (const Base & rhs) const 
{ 
    return j == rsh.j and str == rhs.str; 
} 

作为通用注释,因为类被称为基地可能是你可能需要把它也声明为虚拟的。

ADDED:同样在这种情况下,j将不会初始化。最简单的方法来解决它只是添加初始化器声明:

class Base { 
private: 
    int j = 0; 
    string str; 
// ... 
}; 
+0

在这两种情况下,我都变得不相等。如果内容相同,那么相等应该返回true对吗? – highlander141

+1

在你的情况下,你正在比较两个对象什么没有被初始化。所以如果字符串默认初始化为空,那么我每次都会被垃圾初始化。 –

+0

是的我有你的意思,如果我评论int和字符串,并且只比较静态常量,那么两个对象是相等的。 – highlander141

3

比较运算符逻辑看起来是正确的,但

  1. 你缺少一个const

    bool operator==(const Base &rhs) const; 
    

    这是承诺你让编译器知道你的操作符不会修改它被调用的实例;如果没有它,您的操作员在左侧为const的比较中不可用。

  2. 当然,因为在这里你是比较指针,它已经拥有了比较操作(如果两个指针指向同一个实例,返回true)它不是由线路

    if(&b1 == &b2) 
    

    调用。实际调用您的操作正确的方法是将对象直接比较,比如

    if(b1 == b2) 
    
1

发布的代码是比较基本对象的内存地址。这个if语句总是比较b1和b2之间的错误,除非b1是b2。

1

按照目前的实现,做出如下变化 替换(&b1 == &b2)(b1 == b2),你的代码将正常工作

(&b1 == &b2) =>地址,它永远不会相同的。 (b1 == b2) =>比较内容。