==运算符使用结构重载

== operator overloading with struct

本文关键字:重载 结构 运算符      更新时间:2023-10-16

我试图在结构中定义一个==运算符,如下所示:

struct names {
    string fname;
    string lname;
bool operator==(names a, names b) {
    return (a.fname == b.lname);
}
};

然而,编译器说:

..\src\trash.cpp:10:33:错误:"布尔名称::运算符==(名称,名称)"必须只接受一个参数

为什么会这样?

如果将二进制运算符重载为成员函数,则它应该只接受一个参数。第一个操作数是调用运算符的对象(即*this);第二个操作数是单函数参数。

struct names {
    //...
    // better to pass by reference;
    // make the function 'const' so it can be used on constant objects
    bool operator==(names const & rhs) const {
        return this->fname == rhs.lname;
    }
};

或者,您可以将其重载为非成员函数,并带有两个参数:

bool operator==(names const & lhs, names const & rhs) {
    return lhs.fname == rhs.lname;
}

如果这需要访问私人成员(本例中不是这样),那么它必须是朋友。您可以在类定义中定义好友;在这种情况下,代码看起来与您的示例完全相同,只是函数声明前面有friend

(当然,这不是一个合理的等式定义,因为它不是对称的。如果你可以有a == b,但不能有b==a,很多算法都会崩溃,就像你用这个定义一样。lhs.fname == rhs.fname && lhs.lname == rhs.lname会更有意义。)

operator==旨在比较两个对象是否相等。你可以比较不同物体的名字和姓氏,大概是为了捕捉乔治·拉岑比和艾玛·乔治这样的二重唱。

我会将其作为类的成员函数,并将this用于其中一个对象:

bool operator== (const names &rhs) const {
    return (this->fname == rhs.fname) && (this->lname == rhs.lname);
}

Do:

  • 作为成员功能:

    struct names {
        string fname;
        string lname;
        bool operator==(const names& rhs) const { /* Your code */ }
    };
    
  • 或作为免费功能:

    bool operator==(const names& lhs, const names& rhs) const { /* Your code */ }