运算符重载函数的参数什么时候应该通过常量引用传递?

When should the parameters of operator overloading functions be passed by constant reference?

lhs 和 rhs 通过常量引用 (const Type&) 传递。

CVector operator+ (const CVector& lhs, const CVector& rhs) {
    CVector temp;
    temp.x = lhs.x + rhs.x;
    temp.y = lhs.y + rhs.y;
    return temp;
}
  1. 当要复制的数据是轻量级(廉价)数据时(例如,对于 int、float、char 等。按值传递就可以了)

  2. 参数在function/operator实现中观察到(即输入只读参数)

作为对这两点的总结,你将得到我们将明白为什么我们应该通过常量引用传递。

要清楚地了解,请参阅 http://www.cs.fsu.edu/~myers/c++/notes/references.html

简而言之,确保数据的不变性。

摘自以下link:

When an argument is passed by reference, a reference is created to the actual argument (which takes minimal time) and no copying of values takes place. This allows us to pass large structs and classes with a minimum performance penalty.

References allow the function to change the value of the argument, which in many cases is undesirable. If we know that a function should not change the value of an argument, but don’t want to pass by value, the best solution is to pass by const reference.

A const reference is a reference that does not allow the variable being referenced to be changed. Consequently, if we use a const reference as a parameter, we guarantee to the caller that the function will not (and can not) change the argument!

参考:http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

更愿意遵循这些准则来选择如何获取参数。对于仅输入参数:

  • 始终对所有指向仅输入参数的指针或引用进行 const 限定。

  • 更喜欢按值获取原始类型(例如 char、float)和复制成本较低的值对象(例如 Point、complex)的输入。

  • 更喜欢通过引用 const 获取其他用户定义类型的输入。

  • 如果函数需要其参数的副本,请考虑按值传递而不是引用。这在概念上等同于引用 const 并进行复制,它可以帮助编译器更好地优化临时变量。

对于输出或input/output参数:

  • 如果参数是可选的(这样调用者可以将 null 作为 "not available" 或 "don't care" 值传递)或者如果函数存储副本,则首选通过(智能)指针传递指针或以其他方式操纵参数的所有权。

  • 如果需要参数并且函数不会存储指向它的指针或以其他方式影响其所有权,则首选通过引用传递。这表明该参数是必需的,并使调用者负责提供有效的对象。

参考:[C++ 编码标准:101 条规则、指南和最佳实践]#25。通过值、(智能)指针或引用适当地获取参数

why arguments are passed as constant => 当一个人想要防止相应的数据成员在被调用的函数中被改变时。

why constant references => 防止创建临时对象