这些C++运算符重载有什么问题?

What is wrong with these C++ operator overloadings?

本文关键字:什么 问题 重载 C++ 运算符 这些      更新时间:2023-10-16

这些是作为不正确使用运算符重载的示例给出的,但我不确定为什么会这样。这是就C++而言,我也不太熟悉。谁能解释为什么如果使用它们就不起作用?我知道它们不是完整的代码,但我认为格式是这里强调的问题。

(1)

class Mystery                    //Line 1
{
...
bool operator <= (Mystery);     //Line 2
...
};
bool Mystery::<=(Mystery rightObj)    //Line 3
{
...
}

(二)

class Mystery                       //Line 1
{
...
bool operator <= (Mystery, Mystery);  //Line 2
...
};

(三)

class Mystery                       //Line 1
{
...
friend operator+ (Mystery);         //Line 2
//Overload the binary operator +
...
};

我会尝试比到目前为止的答案更彻底一点:

(1)

bool operator <= (Mystery);     //Line 2
  1. 调用的常量正确性。运算符<=不应修改调用它的实例,并且应该通过尾随const修饰符指示不这样做:

    bool operator <= (Mystery) const;
    
  2. 其他人都建议正确的参数应该通过 const 引用传递,但这里取决于类包含的内容。数字通常按值传递,如果Mystery仅包含一个基元类型的成员,并且具有默认或内联复制构造函数,则按值传递可能是合适的。按值传递时,参数显然无法修改,因此您无需关心const。也适用于所有其他情况。使用常量引用

    bool operator <= (Mystery const &) const;
    

    更常见,因为大多数用户类确实包含不止一个或两个数字,对于微不足道的情况,通常一切都是内联的,编译器将根据需要对其进行优化。

  3. 如果类具有任何适合类型转换的构造函数(来自不同类型的非显式单参数构造函数),则应将运算符重载为非成员函数(如案例(3) 中的operator+)。

    这是因为如果参数只能转换为Mystery,则会找到非成员operator<=,而只有当左运算符是Mystery或派生类型时,才会找到成员运算符。

    仅当至少有一个参数是用户定义类型时,才考虑重载运算符,即编译器不会考虑对类型(int, int)的参数进行bool operator<=(Mystery, Mystery),即使有一个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+

  1. 由于operator+也是二元运算符,因此需要两个参数。

  2. 运算符+需要返回类型。返回类型通常应该是参数类的新实例(即按值返回)。

非成员函数没有尾随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) 错误:预期的是 idenifier 运算符

您缺少第 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

其他吹毛求疵

  1. 如果函数不应该改变参数,请将其设为常量引用。

bool operator <= (Mystery);
右侧对象应该是常量引用。


bool Mystery::<=(Mystery rightObj)语法错误,应为:
bool Mystery::operator <=(const Mystery& rightObj)

bool operator <= (Mystery, Mystery);运算符仅使用一个参数 - 错误

friend operator+ (Mystery);尝试让全局运算符+朋友,应该使用全局范围"::"。全局操作员需要 2 个输入,而不是一个。使用常量引用。运算符还应返回对"this"的引用。

Mystery& operator+(const Mystery& lhs, const Mystery& rhs);