我发现了两种方法来获取函数返回的引用。
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个问题:
为什么我可以将引用(vector<int>&
)传递给实例(vector<int>
),它如何工作?
方法2是否涉及深层复制?因为我运行了这段代码,vector<int> vec3 = rtn_vec();
似乎只是将vec1
复制到vec3
。
答案 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
的任何其他副本一样。