C++ C++;-运算符=自分配检查

C++ C++;-运算符=自分配检查,c++,class,operator-overloading,C++,Class,Operator Overloading,我想做一个操作符=重载函数。在自赋值检查中,如果我按照上面的方法进行检查,它将显示错误,表示二进制表达式(Person和const Person)的操作数无效。。但是如果我这样做,则不会显示错误。 错误是否表示此类型与另一类型不同?但是如果是这样的话,为什么这个==&另一个会起作用呢?在*这个==另一个中,您试图检查两个对象是否具有相同的值。为此,必须为人员定义操作符==。也就是说,Person::operator==()将确定两个Person对象是否具有相同的值 然而,由于您希望防止自我分配,

我想做一个操作符=重载函数。在自赋值检查中,如果我按照上面的方法进行检查,它将显示错误,表示二进制表达式(Person和const Person)的操作数无效。。但是如果我这样做,则不会显示错误。

错误是否表示此类型与另一类型不同?但是如果是这样的话,为什么这个==&另一个会起作用呢?

*这个==另一个
中,您试图检查两个对象是否具有相同的值。为此,必须为
人员定义
操作符==
。也就是说,
Person::operator==()
将确定两个
Person
对象是否具有相同的值

然而,由于您希望防止自我分配,因此您真正需要的是比较两个对象的身份,而不是它们的价值。您可以通过比较它们在内存中的地址来实现这一点,即:

class Person {
private:
    string name;
    int id;

public:
    Person(string name, int id): name(name), id(id) {}
    const Person& operator=(const Person &another) {
        if (*this == another) // What is the problem here?
            return *this;
        // do copy
        return *this;
    }
};

运算符==
的操作数是指向
人员
的指针,而不是
人员
对象。

通过比较两个对象的地址来完成自赋值检查

if (this == &another) // Is "another" the same object?
   return *this; // skip assignment
对于相同类型的指针,C++有一个内置的
操作符==

您的代码正在比较两个对象的值,显然您没有为
Person
类定义
operator==

但是比较这些值并不是正确的做法,因为在指定两个具有相同值的对象时,不需要执行特殊操作,但有时在指定两个相同的对象时会执行特殊操作

事实上,在您展示的类中,没有必要进行任何自我分配测试。简单地说,这没关系

if (this == &another)
不要认为自我分配测试是一种效率增益,因为自我分配很少。因此,如果你可以避免测试,那么通常你应该这样做


同样值得一提的是,通常首选的赋值方法是,它也不需要任何自赋值测试。

您尝试调用的是
操作符==
,它不是为您生成的,因此您必须已经编写但尚未显示。指针有一个内置的相等运算符。根据我的经验,最好让赋值运算符是自赋值安全的,而不是针对病理情况进行优化。
Person& operator=(const Person &another) {
    name = another.name;
    id = another.id;
    return *this;
}