C 超载相等运算符.我应该写自己的功能以接受通过参考或值传递的参数

C++ overloading the equality operator. Should I write my function to accept argument passed by reference or value?

本文关键字:参考 值传 参数 超载 运算符 我应该 功能 自己的      更新时间:2023-10-16

我想对简单struct

的运算符超载
struct MyStruct {
public:
   int a;
   float b;
   bool operator==( ) {  }
}

我看到的所有示例似乎都使用a&。

通过参考来传递该值。

,但我真的想按价值传递这些结构。

我写这本书有什么问题

bool operator== (MyStruct another) { return ( (a==another.a) && (b==another.b) ); } 

,当您按价值通过时,您真的应该没关系。如果结构真的很重,则适用。在您引用的简单示例中,可能没有很大的区别。

说,通过const reference,它更有意义,因为它清楚地表达了过载函数==的意图。const确保过载的函数意外地不会修改对象并通过参考可以使您免于制作副本。对于==操作员,无需仅仅用于比较目的。

如果您担心一致性,最好按价值实例切换另一个通过,以通过const Ref。

虽然保持一致是值得称赞的目标,但不应该过分。仅包含" A"字符的程序将非常一致,但几乎没有用。通过某些技术方面的技术决策,传递机制并不是您出于一致性而做的事情。

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

在您的情况下,可以合理地假设该函数将被绑架,并且通过方案根本无关紧要(因为它不会传递)。这是由Codegen在这里证明的(生成的汇编中没有对operator==的调用):https://gcc.godbolt.org/z/g7oege