C ++重载了相等运算符。我是否应该编写函数以接受通过引用或值传递的参数?

时间:2019-03-20 18:30:27

标签: c++ operator-overloading

我想为简单的结构重载==运算符

struct MyStruct {
public:
   int a;
   float b;
   bool operator==( ) {  }
}

我看到的所有示例似乎都使用&通过引用传递了值。

但是我真的很想按值传递这些结构。

我写成

有什么问题吗?
bool operator== (MyStruct another) { return ( (a==another.a) && (b==another.b) ); } 

2 个答案:

答案 0 :(得分:1)

期望您在按价值传递时支付副本的罚款确实不重要。如果结构真的很重,则适用。在您引用的简单示例中,可能没有太大区别。

话虽如此,通过const reference传递更有意义,因为它清楚地表达了重载函数==的意图。 const确保重载函数意外地不会修改对象,并且按引用传递可以使您免于复制。对于==运算符,无需出于比较目的而传递副本。

如果您担心一致性,最好将其他按值传递实例切换为按const ref传递。

答案 1 :(得分:1)

保持一致是值得称赞的目标,但不应过分。仅包含“ A”字符的程序将非常一致,但几乎没有用。争论传递机制并不是您所做的不一致的事情,它是基于某些技术方面的技术决策。

例如,在您的情况下,按值传递可能可能会导致更好的性能,因为该结构足够小并且在AMD64 ABI上使用(该结构可在任何64位Intel / AMD芯片上使用),它将在寄存器中传递,从而节省了通常与取消引用相关的时间。

在您的情况下,可以合理地假设该函数将被内联,并且传递方案完全无关紧要(因为它不会被传递)。此处的代码生成已证明了这一点(生成的程序集中不存在对operator==的调用):https://gcc.godbolt.org/z/G7oEgE