此代码对于重载比较运算符是否正确?
Is this code correct for overloading comparision operator?
以下代码重载比较运算符是否正确?这段代码中是否存在任何愚蠢的错误或循环漏洞?我特别怀疑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();
}
这个函数签名告诉编译器比较运算符可以改变对象的值,所以它不能在 const 对象上调用。所以最好声明为 const:
bool operator==(const Base &rhs) const;
在此代码中,您正在比较两个对象的地址:
if(&b1 == &b2) // or if(b1 == b2)
{
cout << "Equal\n";
}
else
{
cout << "Not equal\n";
}
他们显然不相等。 if (b1 == b2) { ... } 如果要检查对象是否相等则正确。
What about if we allocate objects on heap, can we compare pointers?
如果 a 和 b 是指针,您可以比较指针值:
*a == *b
或者显式调用 operator== (丑陋的是什么):
a->operator==(*b)
在 C++ 中,将此类运算符声明为友元很常见(但在您的情况下,这不是必需的)。在此代码中使用 this 也不会提高可读性。我希望将此运算符视为:
bool Base::operator == (const Base & rhs) const
{
return j == rsh.j and str == rhs.str;
}
作为一般注意事项,因为 class 被称为 Base,您可能还需要将其声明为虚拟的。
ADDED:在这种情况下,j 也不会初始化。修复它的最简单方法是将初始化程序添加到声明中:
class Base {
private:
int j = 0;
string str;
// ...
};
比较运算符逻辑看起来正确,但是
你少了一个const
bool operator==(const Base &rhs) const;
这是您向编译器做出的承诺,即您的操作员不会修改调用它的实例;没有它,您的运算符在左侧为 const
的比较中不可用。
当然不是
行调用的
if(&b1 == &b2)
因为这里你比较的是指针,它们已经有它们的比较运算符(如果两个指针指向同一个实例,则 returns true
)。实际调用运算符的正确方法是直接比较对象,例如
if(b1 == b2)
发布的代码正在比较基本对象的内存地址。此 if 语句将始终在 b1 和 b2 之间比较 false,除非 b1 是 b2。
根据当前的实施,进行以下更改
将 (&b1 == &b2)
替换为 (b1 == b2)
,您的代码将正常工作
(&b1 == &b2)
=> 比较地址,永远不能相同。
(b1 == b2)
=> 比较内容。
以下代码重载比较运算符是否正确?这段代码中是否存在任何愚蠢的错误或循环漏洞?我特别怀疑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();
}
这个函数签名告诉编译器比较运算符可以改变对象的值,所以它不能在 const 对象上调用。所以最好声明为 const:
bool operator==(const Base &rhs) const;
在此代码中,您正在比较两个对象的地址:
if(&b1 == &b2) // or if(b1 == b2)
{
cout << "Equal\n";
}
else
{
cout << "Not equal\n";
}
他们显然不相等。 if (b1 == b2) { ... } 如果要检查对象是否相等则正确。
What about if we allocate objects on heap, can we compare pointers?
如果 a 和 b 是指针,您可以比较指针值:
*a == *b
或者显式调用 operator== (丑陋的是什么):
a->operator==(*b)
在 C++ 中,将此类运算符声明为友元很常见(但在您的情况下,这不是必需的)。在此代码中使用 this 也不会提高可读性。我希望将此运算符视为:
bool Base::operator == (const Base & rhs) const
{
return j == rsh.j and str == rhs.str;
}
作为一般注意事项,因为 class 被称为 Base,您可能还需要将其声明为虚拟的。
ADDED:在这种情况下,j 也不会初始化。修复它的最简单方法是将初始化程序添加到声明中:
class Base {
private:
int j = 0;
string str;
// ...
};
比较运算符逻辑看起来正确,但是
你少了一个
const
bool operator==(const Base &rhs) const;
这是您向编译器做出的承诺,即您的操作员不会修改调用它的实例;没有它,您的运算符在左侧为
const
的比较中不可用。当然不是
行调用的if(&b1 == &b2)
因为这里你比较的是指针,它们已经有它们的比较运算符(如果两个指针指向同一个实例,则 returns
true
)。实际调用运算符的正确方法是直接比较对象,例如if(b1 == b2)
发布的代码正在比较基本对象的内存地址。此 if 语句将始终在 b1 和 b2 之间比较 false,除非 b1 是 b2。
根据当前的实施,进行以下更改
将 (&b1 == &b2)
替换为 (b1 == b2)
,您的代码将正常工作
(&b1 == &b2)
=> 比较地址,永远不能相同。
(b1 == b2)
=> 比较内容。