这些是作为运算符重载的错误使用的示例给出的,但我不确定为什么会这样。就C ++而言,我对它也不太熟悉。任何人都可以解释为什么如果使用它们会不起作用?我知道它们不是完整的代码,但我认为格式化是这里突出显示的问题。
(1)
class Mystery //Line 1
{
...
bool operator <= (Mystery); //Line 2
...
};
bool Mystery::<=(Mystery rightObj) //Line 3
{
...
}
(2)
class Mystery //Line 1
{
...
bool operator <= (Mystery, Mystery); //Line 2
...
};
(3)
class Mystery //Line 1
{
...
friend operator+ (Mystery); //Line 2
//Overload the binary operator +
...
};
答案 0 :(得分:1)
到目前为止,我会尝试比答案更彻底:
bool operator <= (Mystery); //Line 2
Invocant的Const正确性。运算符<=
不应该修改它被调用的实例,并且应该指示尾随的const
修饰符不会这样做:
bool operator <= (Mystery) const;
其他人都建议正确的参数应该由const引用传递,但这取决于类包含的内容。数字通常按值传递,如果Mystery
只包含一个基本类型的成员并且具有默认或内联复制构造函数,则传递值可能是合适的。通过值传递时,显然无法修改参数,因此您无需关心const
。适用于所有其他案例。使用const引用
bool operator <= (Mystery const &) const;
更常见,因为大多数用户类确实包含的不仅仅是一个或两个数字,而且对于普通情况,所有内容通常都是内联的,编译器会根据需要对其进行优化。
如果类有任何适合类型转换的构造函数(来自不同类型的非显式单个参数构造函数),则操作符应作为非成员函数重载(如案例中的operator+
<强>(3)强>)。
这是因为如果参数只能转换为operator<=
,则会找到非成员Mystery
,而只有左操作符为Mystery
或派生时才会找到成员运算符类型。
只有当至少一个参数是用户定义的类型时,才会考虑重载运算符,即即使存在bool operator<=(Mystery, Mystery)
,编译器也不会对(int, int)
类型的参数考虑Mystery::Mystery(int)
构造函数,使其成为可行的转换。但是,它会考虑(int, Mystery)
的参数列表的非成员运算符,而不会考虑成员bool Mystery::operator<<(Mystery) const
运算符。
bool Mystery::<=(Mystery rightObj) //Line 3
缺少operator
关键字。
bool Mystery::operator<=(Mystery rightObj)
bool operator <= (Mystery, Mystery); //Line 2
签名不正确。 operator<=
有2个参数,其中一个是调用者,因此只需要一个显式参数。
friend operator+ (Mystery); //Line 2
这指的是非会员operator+
。
由于operator+
也是二元运算符,因此它需要两个参数。
运算符+
需要返回类型。返回类型通常应该是参数类的新实例(即按值返回)。
非成员函数没有尾随const
修饰符,因为它们没有调用。参数应该通过值或const引用传递,具体取决于类的内容:
friend Mystery operator+ (Mystery, Mystery);
friend Mystery operator+ (Mystery const &, Mystery const &);
friend
关键字仅在类中声明时才出现,以使函数能够访问其私有成员。课外(例如在定义中)只是:
Mystery operator+ (Mystery, Mystery);
Mystery operator+ (Mystery const &, Mystery const &);
答案 1 :(得分:0)
案例(1) 错误:预期的识别符操作符
您错过了第3行的关键字operator
bool Mystery::operator<=(const Mystery& rightObj) //Line 3
{
...
}
案例(2) 错误:关系运算符的参数太多
作为成员函数重载的关系运算符应该只有一个参数
bool operator <= (const Mystery&); //Line 2
案例(3)
缺少显式返回类型
friend Mystery operator+ (const Mystery&); //Line 2
其他挑剔
答案 2 :(得分:0)
bool operator <= (Mystery);
右侧对象应该是const引用。
bool Mystery::<=(Mystery rightObj)
语法错误,应该是:
bool Mystery::operator <=(const Mystery& rightObj)
bool operator <= (Mystery, Mystery);
操作员只使用一个参数 - 错误
friend operator+ (Mystery);
试图使全局运算符+朋友,应使用全局范围“::”。全球运营商需要2个输入,而不是一个。使用const引用。操作员还应该返回对“this”的引用。
Mystery& operator+(const Mystery& lhs, const Mystery& rhs);