这些是作为不正确使用运算符重载的示例给出的,但我不确定为什么会这样。这是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 +
...
};
最佳答案
我会尝试比目前的答案更透彻一点:
(1)
bool operator <= (Mystery); //Line 2
调用者的常量正确性。接线员
<=
不应该修改它被调用的实例,并且应该通过尾随const
来指示不这样做修饰符:bool operator <= (Mystery) const;
其他人都建议正确的参数应该通过 const 引用传递,但在这里它取决于类包含的内容。数字通常按值传递,如果
Mystery
仅包含一个原始类型成员并具有默认或内联复制构造函数,按值传递可能是合适的。按值传递时,参数显然不能修改,所以你不需要关心const
.也适用于所有其他情况。使用常量引用bool operator <= (Mystery const &) const;
更常见,因为大多数用户类确实包含不止一两个数字,对于微不足道的情况,所有内容通常都是内联的,编译器会根据需要对其进行优化。
如果类有任何适合类型转换的构造函数(来自不同类型的非显式单参数构造函数),运算符应作为非成员函数重载(如 中的
operator+
(3)).这是因为非成员(member)
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)
(2)
bool operator <= (Mystery, Mystery); //Line 2
签名不正确。 operator<=
接受 2 个参数,其中一个是调用者,因此它只需要一个显式参数。
(3)
friend operator+ (Mystery); //Line 2
这里指的是非成员(member)operator+
.
自
operator+
也是二元运算符,需要两个参数。运算符(operator)
+
需要一个返回类型。返回类型通常应该是参数类的新实例(即按值返回)。
非成员函数没有尾随 const
修饰符,因为他们没有祈求者。参数应根据类的内容按值或常量引用传递:
friend Mystery operator+ (Mystery, Mystery);
friend Mystery operator+ (Mystery const &, Mystery const &);
friend
关键字仅在类内部声明时出现,以授予函数访问其私有(private)成员的权限。在类之外(例如在定义中)它只是:
Mystery operator+ (Mystery, Mystery);
Mystery operator+ (Mystery const &, Mystery const &);
关于c++ - 这些 C++ 运算符重载有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21522511/