【问题标题】:C++ - operator= self assignment checking [duplicate]C ++ - 运算符=自赋值检查[重复]
【发布时间】:2020-06-01 10:46:04
【问题描述】:
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,则不会显示错误。
错误是说this 的类型和another 的类型不同吗?但如果是这样,this == &another 怎么会起作用?

【问题讨论】:

  • 你正在尝试调用operator==,它不是为你生成的,所以你一定是写了但没有显示。有一个内置的指针相等运算符。
  • 根据我的经验,最好让赋值运算符自我赋值安全而不是针对病态情况进行优化。

标签: c++ class operator-overloading


【解决方案1】:

*this == another 中,您试图检查两个对象是否具有相同的值。为此,您必须为Person 定义operator==。即Person::operator==() 将判断两个Person 对象是否具有相同的

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

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

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

【讨论】:

    【解决方案2】:

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

    if (this == &another)
    

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

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

    但是比较值并不是正确的做法,因为当您分配两个具有相同值的对象时不需要特殊操作,但有时当您分配两个 相同 对象时.

    事实上,您所展示的课程中没有必要进行任何自我分配测试。就这样就OK了

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

    不要认为测试自我分配可以提高效率,因为自我分配很少见。因此,如果您可以避免测试,那么通常您应该这样做。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2015-12-30
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 2016-08-30
      相关资源
      最近更新 更多