如何获得返回的向量参考?

时间:2018-11-15 15:12:08

标签: c++ reference return-value

我发现了两种方法来获取函数返回的引用。

vector<int> vec1 = {4,5,6};

vector<int>& rtn_vec(void)
{
    return vec1;
}

int main()
{
    vector<int> &vec2 = rtn_vec(); //way 1
    vector<int> vec3 = rtn_vec(); //way2

    vec2[0] = 3;

    return 0;
}

我了解方式1意味着将对vec1的引用传递给&vec2,因此vec2[0] = 3;会将vec1更改为{3,5,6}

关于方法2,我有2个问题:

  1. 为什么我可以将引用(vector<int>&)传递给实例(vector<int>),它如何工作?

  2. 方法2是否涉及深层复制?因为我运行了这段代码,vector<int> vec3 = rtn_vec();似乎只是将vec1复制到vec3

2 个答案:

答案 0 :(得分:5)

vector<int> vec3 = rtn_vec(); //way2

这会分配一个新的向量并调用一个副本构造函数,所以是的,这是“深层”副本。

实际上,这与简单地写作没什么不同

vector<int> &vec2 = vec1;
vector<int> vec3 = vec1;

或者让事情变得更清楚

vector<int> &return_value = vec1;
vector<int> &vec2 = return_value;
vector<int> vec3 = return_value;

(尽管请注意“ deep”一词。如果它是vector<int*>,则仅复制指针,而不复制int本身。)

答案 1 :(得分:0)

在复制构造vec3时,会生成一个 shallow 副本(C ++并不真正进行“深层”复制)。向量中的所有元素均按值 复制,就像std::vector的任何其他副本一样。