运算符重载自我分配

时间:2019-04-16 11:31:45

标签: c++

任何人都可以解释以下功能。

  AddressBook& operator =(const AddressBook& bok);///add this two to your struct
    bool operator ==(const AddressBook& bok);///

/***************************************************************************************/
    ///anywhere outside main add this definitions

    bool AddressBook::operator ==(const AddressBook& bok)
    {
        return (firstname==bok.firstname&&lastname==bok.lastname&&addr==bok.addr&&phone==bok.phone);
    }

    AddressBook& AddressBook::operator=(const AddressBook& bok)
    {
        if(*this==bok)
            return *this;
        else
        {
            firstname=bok.firstname;
            lastname=bok.lastname;
            addr=bok.addr;
            phone=bok.phone;
        }
         return *this;
    }

1 个答案:

答案 0 :(得分:1)

这里有两个功能。它们都超载operators
在这种情况下,相等性operator==的比较运算符将比较类型为AddressBook的两个对象。当它们在truefirstnamelastnameaddr中匹配时,它将返回phone(假设两个地址簿对象相等)。
赋值运算符将允许您将AddressBook对象赋值给另一个对象,并且它将复制值。

if (*this = bok)
    return *this;
在这种情况下,

检查是否为自己分配了一个对象。在类this中,指向该对象的实例。在这种情况下,=运算符的左侧。如果它们相同(意味着它们在内存中的地址相同),则不会复制任何内容。
=运算符返回分配的值。这就是为什么

a = b = 7;

有效。 b = 7将7分配给b。操作员返回值7。然后将返回值7分配给a。该操作的返回值将被丢弃。
这也是不幸的原因

int a = 5, b = 7;
if(a = b) // assignment, not comparison!
{ /*Do things*/ }

有效。为a分配了b的值,然后将赋值操作的返回值(b的值7)用作条件,其结果为true。即使您确实想要这样的东西,也很糟糕,应该用两行写成。
c和c ++中的所有运算符都是函数调用。