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

时间:2014-02-03 08:19:06

标签: c++ operator-overloading

这些是作为运算符重载的错误使用的示例给出的,但我不确定为什么会这样。就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 +
    ...
};

3 个答案:

答案 0 :(得分:1)

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

(1)

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

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

    bool operator <= (Mystery const &) const;
    

    更常见,因为大多数用户类确实包含的不仅仅是一个或两个数字,而且对于普通情况,所有内容通常都是内联的,编译器会根据需要对其进行优化。

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

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

    只有当至少一个参数是用户定义的类型时,才会考虑重载运算符,即即使存在bool operator<=(Mystery, Mystery),编译器也不会对(int, int)类型的参数考虑Mystery::Mystery(int)构造函数,使其成为可行的转换。但是,它会考虑(int, Mystery)的参数列表的非成员运算符,而会考虑成员bool Mystery::operator<<(Mystery) const运算符。

  4. 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
    

    这指的是非会员operator+

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

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

    3. 非成员函数没有尾随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

其他挑剔

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

答案 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);