C++ 对于重载比较运算符,此代码正确吗?
以下代码对于重载比较运算符是否正确?这段代码中有没有愚蠢的错误或循环漏洞?我特别怀疑if循环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(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)