gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:37 27 4
gpt4 key购买 nike

对 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;
}

最佳答案

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

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

特别是,当您有一个复制不便宜的参数时(例如intfloat,都是的例子em>便宜 复制参数;std::vectorstd::string便宜的示例复制参数),然后您在方法中观察这个参数(即它是一个输入只读参数),然后您可以通过 const 传递它引用 (const &)

这样一来,基本上就相当于将原始参数的地址传给了函数,所以不涉及深拷贝。深拷贝可能非常昂贵,例如考虑一个包含大量元素的 vector 。

因此,回顾一下,您在以下情况下通过常量引用:

  1. 参数的复制并不便宜(例如,对于整数、 float 等。只是不要打扰:按值传递就好了)
  2. 在函数/运算符实现中观察到参数(即它是一个输入只读参数)

关于c++ - 通过引用重载运算符传递对象 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26251510/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com