【问题标题】:C++, = operator different optionsC++, = 运算符不同的选项
【发布时间】:2020-09-19 23:46:26
【问题描述】:

我为= 运算符编写了以下函数:

Set& Set::operator=(const Set& s)
{
    delete[] data;
    data=new int [s.size];
    size=s.size;
    maxSize=s.size;
    for (int i=0;i<size;i++)
    {
        data[i]=s.data[i];
    }
    return *this;
}

但是,我希望以下代码按预期工作(不删除当前数据):

Set s1,s2;
s1=s1;

所以我做了以下更改:

Set& Set::operator=(const Set& s)
{
    if (this == &s)
    {
        return *this;
    }
    delete[] data;
    data=new int [s.size];
    size=s.size;
    maxSize=s.size;
    for (int i=0;i<size;i++)
    {
        data[i]=s.data[i];
    }
    return *this;
}

我的问题是:

1.为什么这是正确的:

    if (this == &s)
    {
        return *this;
    }

虽然不是这样:

    if (this == s)
    {
        return *this;
    }

s 是一个引用,所以它是内存中的一个位置,不需要使用&amp;operator 来处理它

2.我们可以写下面的内容而不是上面显示的内容:

    if (*this == s)
    {
        return *this;
    }

【问题讨论】:

  • this 是指针,s 是引用,所以this == s 试图比较指针和非指针。
  • 最好使用自分配安全方法:Set&amp; Set::operator=(Set const&amp; s) { size = s.size; auto new_data = new int[size]; std::copy(s.data, s.data + size, new_data); delete[] data; data = new_data; return *this; }

标签: c++ class operator-overloading operators equals


【解决方案1】:

s 是对对象的引用。将其视为别名。它不是一个指针,所以你不能把它和this比较一个指针。

至于比较*thiss。这并不完全符合您的要求。它比较两个对象是否相等,并且 许多 类型的对象可能包含相同的值,因此比较相等。但是,你想要的不是对象比较是否相等,你想知道它们是否是相同的对象。

比较&amp;sthis 可以告诉您这两个对象是否位于相同的内存地址。如果它们在同一个位置,那么它们是同一个对象,如果不是,那么它们只是相同类型的两个实例(可能相等)。所以这就是你想要的。

【讨论】:

    【解决方案2】:

    this是存储对象地址的指针,s是对某个对象的引用。

    这个检查:

    if (this == &s)  // compares addresses
    

    正在检查s 的地址是否与分配给的对象的地址相同。这就是你想要的,而且是正确的。

    这个检查:

    if (this == s)  // error, good
    

    比较指针和对象,会产生编译错误。

    这个检查:

    if (*this == s)  // compares values
    

    s 与对象进行比较。这是不正确的,因为 2 个不同的对象可以具有相同的值,而它们当然具有不同的地址。这不是自赋值的情况,是不正确的。

    【讨论】:

      【解决方案3】:

      s 是一个引用,所以它是内存中的一个位置,不需要使用 &operator 来处理它

      是的,s 是一个参考。但它是内存中的一个位置这一事实是一个实现细节。从语法上讲,它的行为就像一个对象。你需要在它前面使用&amp; 来获得一个可用的地址(虽然,是的,显然地址已经存在了)。

      如果 (*this == s)

      不,您不应该使用它。您的 operator== 将比较两个列表是否相同(相同的内容)而不是它们是否是相同的列表(相同的对象)。避免复制的原因是因为对象会自己修改。

      但是,如果您的operator== 定义明确,您就可以摆脱这个问题。当您分配两个相同的对象时,它什么也不做。我建议不要。你永远不知道,将来当对象变得更复杂时,比较对象会有什么微妙之处。

      【讨论】:

        【解决方案4】:

        如果我完全理解您要搜索的内容,

           if (this != &s)
            {
               //Processing 
            }
        

        在这种情况下,您告诉编译器,如果(当前对象的)this 地址与目标(s)的地址不同,您可以处理实现。

        以游戏中的两个角色为例,如果我们在战斗中

        void Character::punch(Character &other); //function
        

        (this == &amp;s) 表示 Subject 正在打自己(不是我们所期望的),以实现安全:

        void Character::punch(Character &other) {
                   if (this != &s)
                    {
                       other.recievesDamage(punchDmg); /* w/ punchDmg defined */
                    }
         } 
        

        所以这取决于您的想法,以及您想要做什么,最重要的是,它意味着比较当前对象是否与另一个相同(在您的示例中为s),如果它们不一样参考,尽管属性相同,这意味着它们只是在数据上相似,但它们不是同一个。

        if (*this == s)
                {
                   //Processing 
                }
        

        您只是在 s 和对象之间进行比较。

         if (this == s)
                    {
                       //Processing 
                    }
        

        你在一个指针引用和一个对象之间进行比较。

        【讨论】:

          猜你喜欢
          • 2018-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-02
          • 2012-04-26
          相关资源
          最近更新 更多