通过引用重载运算符传递对象 - C++

Que*_*ark 6 c++ operator-overloading pass-by-reference

C++的新手.我见过人们通常在运算符重载时通过引用传递对象.好吧,我无法弄清楚什么时候真的有必要.如下面的代码所示,如​​果我在operator +中删除对象c1和c2的声明中的&符号,我仍然会得到相同的结果.当我们不想修改c1或c2时,在这种情况下是否有任何理由通过引用?

#include <iostream>

class Keys
{
private:
    int m_nKeys;

public:
    Keys(int nKeys) { m_nKeys = nKeys; }

    friend Keys operator+(const Keys &c1, const Keys &c2);

    int GetKeys() { return m_nKeys; }
};


Keys operator+(const Keys &c1, const Keys &c2)
{
    return Keys(c1.m_nKeys + c2.m_nKeys);
}

int main()
{
    Keys cKeys1(6);
    Keys cKeys2(8);
    Keys cKeysSum = cKeys1 + cKeys2;
    std::cout << "There are " << cKeysSum.GetKeys() << " Keys." << std::endl;
    system("PAUSE");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mr.*_*C64 8

运算符就像普通函数一样,只是带有“花哨的”名称:)
(例如operator+()而不是sum()

因此,您应用于函数的相同参数传递规则也可以应用于重载运算符。

特别是,当您拥有一个不便宜的参数复制时(例如int,a,a float,是廉价复制参数的示例; a std::vector,a std::string,是便宜复制的参数示例),并且您在方法内部观察到此参数(即它是一个输入只读参数),然后可以通过const reference传递它 (const &)

这样,基本上就像将原始参数的地址传递给函数一样,因此不涉及任何深层复制。深度复制可能非常昂贵,例如,想到具有大量元素的向量。

因此,回顾一下,您可以在以下情况下通过const引用传递:

  1. 仅复制该参数并不便宜(例如,用于int,float等。请不要打扰:按值传递就可以了)
  2. 该参数在函数/运算符实现中被观察到(即,它是一个输入只读参数)