为什么我不能设置 *this == 类对象

Why can't I set *this == class object

提问人:Seungmin Lee 提问时间:5/5/2020 最后编辑:Vlad from MoscowSeungmin Lee 更新时间:5/5/2020 访问量:94

问:

我正在重载运算符 = 进行复习。 为什么我可以设置“this == &st”而不是“*this == st”?

StringBad & StringBad::operator=(const StringBad & st)
{
    if (this == &st)           // if the object assigned to itself, return to itself. 
        return *this;          // why compiler give error when I set *this ==st ?

/* blah blah
...
... */

    return *this;              // return reference to invoking object
}
C++ 定义 赋值运算符

评论

2赞 Slava 5/5/2020
你可以,但你不想
1赞 NathanOliver 5/5/2020
你有吗?如果没有,则不能与它们一起使用。StringBad::operator====
1赞 NathanOliver 5/5/2020
此外,仅仅因为两个对象比较相等并不意味着它们是同一个对象。
1赞 bruno 5/5/2020
如果您喜欢 2 个(或更多)答案,您可以接受一个并投票给另一个
1赞 eesiraed 5/5/2020
“数组名称表示第一个元素的'地址'” - 否。数组可以衰减为指向第一个元素的指针,但数组的名称不是指向第一个元素的指针。在某些情况下,这种差异很重要。

答:

2赞 cigien 5/5/2020 #1

比较 2 个指针与比较这些指针的值不是一回事。例如:

int *a, *b;
if(a == b) 
if (*a == *b) // not the same

当然,如果 2 个指针相同,则它们指向相同的值,但反之则不成立。

在这种情况下,检查 if 将编译(假设定义为 ),但这与检查 if 不是一回事。*this == stoperator==StringBadthis == &st

2赞 Vlad from Moscow 5/5/2020 #2

两个不同的对象可以彼此相等,但这并不意味着它们是相同的。

以身作则

#include <iostream>
#include <iomanip>

int main() 
{
    int x = 0;
    int y = 0;

    std::cout << "x == y is " << std::boolalpha << ( x == y ) << '\n';
    std::cout << "&x == &y is " << std::boolalpha << ( &x == &y ) << '\n';
}

程序输出为

x == y is true
&x == &y is false

因此,需要进行此检查以确定此处是否存在自分配。this == &s

0赞 R Sahu 5/5/2020 #3

为什么我可以设置但不能?this == &st*this == st

我想你的意思是说,为什么我可以使用但不能?this == &st*this == st

暂且忽略这一点,答案是,是的,你可以,但这不一定是总是正确的做法。它可能适合您的情况。在这种情况下,您当然应该使用它。当然,这意味着你需要先为你的类实现。operator==

下面是一个示例,您不应该使用该示例来使赋值成为 noop。*this == st

假设您有一个类,它捕获具有值和单位的物理量,假设您有:

对象,表示 1 “m”。
对象,表示 100 “cm”。
ab

当 yoou 比较 时 , 你应该 回来 。但是,当您分配给IMO或反之亦然时,您应该继续分配。abtrueab