C ++-运算符=自赋值检查

时间:2020-06-01 10:46:04

标签: c++ class operator-overloading

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;
    }
};

我想做一个operator =重载函数。在自我分配检查中,如果执行上述检查,则会显示错误,提示Invalid operands to binary expression (Person and const Person)。但是,如果我执行this == &another,将不会显示任何错误。
错误是否说明thisanother的类型不同?但是如果是这样,this == &another会如何工作?

2 个答案:

答案 0 :(得分:1)

*this == another中,您尝试检查两个对象是否具有相同的值。为此,您必须为operator==定义Person。也就是说,Person::operator==()将确定两个Person对象是否具有相同的 value

但是,由于要防止自我分配,因此真正需要的是比较两个对象的身份 –而不是它们的。您可以通过比较它们在内存中的地址来实现此目标,即:

if (this == &another) // Is "another" the same object?
   return *this; // skip assignment

operator==的操作数是指向Person的指针,而不是Person对象的指针。

答案 1 :(得分:0)

通过比较两个对象的地址完成自我分配检查

if (this == &another)

C ++内置operator==用于相同类型的指针。

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

但是比较这些值不是正确的事情,因为当您分配两个具有相同值的对象时不需要采取特殊操作,但是有时当您分配两个相同对象时

实际上,您无需在您演示的课程中进行任何自赋值测试。简单就可以了

Person& operator=(const Person &another) {
    name = another.name;
    id = another.id;
    return *this;
}

不要认为自我分配测试是任何一种效率增益,因为自我分配很少。因此,如果您可以避免测试,那么通常应该这样做。

值得一提的是,通常首选的分配方法是copy and swap idiom,它也不需要任何自我分配测试。