什么&在这种情况下呢?

时间:2013-07-30 10:14:47

标签: c++ vector

我今天有以下代码:

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(); )?

3 个答案:

答案 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返回的向量内容复制到新向量。

相关问题