==运算符使用结构重载
== operator overloading with struct
我试图在结构中定义一个==运算符,如下所示:
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 */ }
相关文章:
- 在哪里声明结构运算符重载
- 为私有结构定义双参数运算符重载
- 重载嵌套结构/类的流插入运算符
- 逗号在重载 ostream 和 istream 在结构中分开
- 重载运算符>>() 表示未知的输入长度/结构
- 类层次结构中的运算符重载
- 为什么我应该重载 () 运算符以在结构而不是类中priority_queue?
- 具有重载方法的可变参数数据结构
- std::cout 不适用于结构的重载"<<"运算符
- 为什么C++在自定义结构向量时会出现 ostream 重载问题?
- Ho 在标头中声明是结构中的重载运算符?
- 指向结构的指针的运算符重载
- 结构外部的重载运算符
- 无法使用"enable_if"和"is_base_of"将模板函数"operator+"的重载限制到我的类层次结构
- 菱形层次结构中的虚函数重载在 clang 和 gcc 中产生不同的结果
- 如何重载结构的空运算符
- 如何重载结构向量的<<
- C++ 运算符<重载结构
- c++运算符+=重载结构字符串
- 如何正确重载结构'+'运算符