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

标签 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 +
    ...
};

最佳答案

我会尝试比目前的答案更透彻一点:

(1)

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

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

    bool operator <= (Mystery const &) const;
    

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

  3. 如果类有任何适合类型转换的构造函数(来自不同类型的非显式单参数构造函数),运算符应作为非成员函数重载(如 中的 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+ .

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

  2. 运算符(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/

相关文章:

c++ - C++ 中运算符 << 的重写

c++ - 无法在 C++ 中定义++ 运算符,这里有什么问题?

c++ - 运营商新实现可见性问题

java - Qt server/Java Client通讯问题

c++ - 计算总 CPU 使用率

c++ - 具有内部随机函数的结构的 CUDA 移植

c++ - (*,+,-,/,=) 的运算符重载?

c++ - C++ 中的 Floyd 算法

C++,模板化指向函数的指针

c# - 重载 "Set to equal to"运算符