1

我今天有以下代码:

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

为什么我需要 & 两次?在我假设的返回中,因为它会生成要返回的向量的副本,但是为什么我需要在分配运算符中使用它(

std::vector<float>& vecHighRes = highRes->getSamples(); ) ?

4

3 回答 3

7

LHS 上的&表示这vecHighRes是一个参考:

std::vector<float>& vecHighRes = highRes->getSamples();

如果您省略了&,vecHighRes将是 vector 的副本,fSamplesgetSamples.

与此相同:

int a = 42;
int& b = a;  // b is a reference to a
int c = b;   // c is a copy of a
于 2013-07-30T10:18:00.090 回答
1

getSamples()返回一个参考

std::vector<float>& vecHighRes = highRes->getSamples(); 

&, vecHighRes是对 的引用std::vector<float>。没有被调用fSamples后被复制。highRes->getSamples()

std::vector<float> vecHighRes = highRes->getSamples(); 

在这种情况下,vecHighRes 是一个浮点向量。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   
于 2013-07-30T10:19:31.480 回答
0

因为,以这种方式,您将引用分配给引用。如果省略 vecHighRes 的引用,赋值运算符会将 get samples 返回的向量的内容复制到新向量。

于 2013-07-30T10:20:40.357 回答