我今天有以下代码:
std::vector<float>& vecHighRes = highRes->getSamples();
PMHighResolution.cpp / .h
std::vector<float>& getSamples();
static std::vector<float> fSamples;
std::vector<float>& PMHighResolution::getSamples()
{
return fSamples;
}
为什么我需要&amp;那两次? 在我假设的回报中,因为它否则会生成要返回的向量的副本,但为什么我需要在assign运算符中使用它(
std::vector<float>& vecHighRes = highRes->getSamples();
)?
答案 0 :(得分:7)
LHS上的&
表示vecHighRes
是参考:
std::vector<float>& vecHighRes = highRes->getSamples();
如果您遗漏了&
,vecHighRes
将是fSamples
的副本,它是由getSamples
返回的引用构建的。
与此相同:
int a = 42;
int& b = a; // b is a reference to a
int c = b; // c is a copy of a
答案 1 :(得分:1)
getSamples()
返回引用
std::vector<float>& vecHighRes = highRes->getSamples();
&
,vecHighRes
是对std::vector<float>
的引用。在fSamples
被调用后,不会复制highRes->getSamples()
。
std::vector<float> vecHighRes = highRes->getSamples();
在这种情况下,vecHighRes是float的向量。 getSamples将制作一个完整的矢量副本。
你可能会在函数参数
中看到很多这种形式 void func(std::vector<float>& vecHighRes, // pass by reference only. only reference is copied
std::vector<float> vecHighRes2) // pass by value, whole vector is copied
答案 2 :(得分:0)
因为这样您就可以为引用分配引用。如果省略vecHighRes的引用,赋值运算符会将get samples返回的向量内容复制到新向量。