将函数参数添加到矢量

时间:2018-02-20 06:55:10

标签: c++ vector parameter-passing pass-by-value

来自Java背景我对C ++如何允许按值传递对象感到困惑。关于何时通过值传递对象,我有一个概念上的疑问:

void add_to_vector(vector<SomeClass>& v, SomeClass var) {
    v.push_back(var);
}

这在概念上是否正确?这就是为什么我觉得这是错误的:var正在按值传递,对象的内存将在函数调用的堆栈上分配。然后将其添加到矢量中。在函数调用结束时,将清除堆栈,因此var引用的对象也将被清除。因此,vector现在将包含一个在函数调用后不再存在的对象。

我错过了什么吗?

2 个答案:

答案 0 :(得分:10)

您缺少值语义的强大概念。就像var是函数中的本地副本一样,std::vector的设计使得在v.push_back(var);之后,v拥有{{1}的副本 }}。这意味着可以使用var的元素而不必担心它们来自何处(除非v具有引用语义的成员,或者以某种方式或其他方式触及共享状态。)

答案 1 :(得分:5)

是的,你缺少C ++值语义。在Java中,向量仅包含对象引用,对象值本身驻留在堆上,并在不再使用时收集。在C ++中,向量包含对象值,因此实际上,向量将保持其自己的私有值,而与函数的本地无关。即使你通过引用传递var,vector也会拥有自己的私有副本。将它们视为深层复制品。

如果您不打算在push_back之后使用该值,那么在您的示例中通过值传递var时,您可能想要push_back(std::move(var)) BTW。