C++ 对于重载比较运算符,此代码正确吗?

C++ 对于重载比较运算符,此代码正确吗?,c++,operator-overloading,pass-by-reference,C++,Operator Overloading,Pass By Reference,以下代码对于重载比较运算符是否正确?这段代码中有没有愚蠢的错误或循环漏洞?我特别怀疑if循环if(b1==b2)或if(&b1==b2)?哪一个是正确的,我想最终通过引用是正确的。如果我们在堆上分配对象,我们可以比较指针吗 代码如下: #include <QCoreApplication> #include <iostream> using namespace std; class Base{ private: //static const int i=10;

以下代码对于重载比较运算符是否正确?这段代码中有没有愚蠢的错误或循环漏洞?我特别怀疑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();
}
#包括
#包括
使用名称空间std;
阶级基础{
私人:
//静态常数i=10;
int j;
字符串str;
公众:
//void display()常量;
//int read();
布尔运算符==(常数基和rhs);
};
布尔基::运算符==(常量基和rhs)
{
如果((this->j==rhs.j)和&(this->str==rhs.str))
返回true;
其他的
返回false;
}
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
碱基b1,b2;
if(&b1==&b2)//或if(b1==b2)
{

cout此函数签名告诉编译器Comparison运算符可以更改对象值,因此不能在const对象上调用它。因此最好将其声明为const:

bool operator==(const Base &rhs) const;
在此代码中,您正在比较两个对象的地址:

if(&b1 == &b2) // or if(b1 == b2)
{
    cout << "Equal\n";
}
else
{
    cout << "Not equal\n";
}
或调用运算符==显式(什么是丑陋的):

< C++中常见的声明此类操作符为朋友(但在你的情况下,它不是必需的)。使用此代码内部的代码并不能使可读性更好。我想将这个操作符看作:

bool Base::operator == (const Base & rhs) const
{
    return j == rsh.j and str == rhs.str;
}
一般来说,由于该类被称为Base,您可能还需要将其声明为virtual

添加:在这种情况下,j将不会初始化。修复它的最简单方法是在声明中添加初始值设定项:

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

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

  • 您缺少一个
    const

    bool operator==(const Base &rhs) const;
    
    这是您向编译器做出的承诺,即您的运算符不会修改调用它的实例;如果没有它,您的运算符将无法在左侧为
    const
    的比较中使用

  • 当然,该行不会调用它

    if(&b1 == &b2) 
    
    因为这里是比较指针,指针已经有了比较运算符(如果两个指针指向同一个实例,则返回
    true

    if(b1 == b2)
    

  • 发布的代码正在比较基本对象的内存地址。此if语句将始终在b1和b2之间比较false,除非b1是b2。

    根据当前实现,进行以下更改 将
    (&b1==b2)
    替换为
    (b1==b2)
    ,您的代码将正常工作

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

    在任何一种情况下,我都得到不相等的结果。如果内容相同,那么相等值应该返回true,对吗?在您的情况下,您正在比较两个未初始化的对象。因此,如果字符串默认初始化为空,则每次我都被垃圾初始化。是的,如果我在如果只比较静态常量,那么这两个对象是相等的。
    if(&b1 == &b2) 
    
    if(b1 == b2)