使用返回引用的函数声明变量作为引用

时间:2013-06-06 09:47:40

标签: c++ reference

我有一个简单的功能:

vector<float>& myFunction() {
    //> Do something and return a vector<float> (don't worry about scoping now )
}

现在其他地方的区别是:

vector<float>& myNewVar = myfunction();
             ^

vector<float> myNewVar = myfunction();  //> Without reference

第二个例子不等同于这种情况:

void myFunction(vector<float>& outVector) {
   //> some code
}

vector<float> myVect;
myFunction(myVect);   

2 个答案:

答案 0 :(得分:4)

在此版本中

vector<float>& myNewVar = myfunction();

myNewVar引用,无论myfunction()返回引用的内容。

在这一个

vector<float> myNewVar = myfunction();

myNewVar副本,无论myfunction()返回引用。它将引用作为std::vector<float>的复制构造函数的输入。

如果没有功能,可能会更好地说明这一点:

int i = 42;

// I want a referennce, so I create one
int& j = i;

// I want a copy, so I make one, even though j is a reference. 
// j is just an alias for i, so k really is a copy of i.
int k = j;

答案 1 :(得分:1)

在第二种情况下,调用copy-ctor,在第一种情况下不是:

class MyClass
{
public:
    MyClass() { }
    MyClass(const MyClass & right)
    {
        printf("Copy ctor\n");
    }
};

MyClass & fn()
{
    // Only for the sake of example
    // Please don't complain ;)
    return *(new MyClass());
}

int main(int argc, char * argv)
{
    printf("First case\n");

    MyClass & a = fn();

    printf("Second case\n");

    MyClass b = fn();
}

编辑:回答您的问题:

第二个例子不是等同于这种情况:
void myFunction(vector<float>& outVector) {
   //> some code
}

vector<float> myVect;
myFunction(myVect);   

这取决于。如果不在myFunction中分配outVector,则不会调用copy-ctor。差异很小,但确实存在。