将函数参数添加到向量
Posted
技术标签:
【中文标题】将函数参数添加到向量【英文标题】:Adding function parameters to a vector 【发布时间】:2018-07-30 11:22:10 【问题描述】:来自 Java 背景,我对 C++ 如何允许按值传递对象感到困惑。我对对象何时按值传递存在概念上的疑问:
void add_to_vector(vector<SomeClass>& v, SomeClass var)
v.push_back(var);
这在概念上是否正确?这就是为什么我觉得这是错误的:var
是按值传递的,对象的内存将在堆栈上分配给函数调用。然后它被添加到向量中。在函数调用结束时,堆栈将被清除,因此var
引用的对象也将被清除。所以vector现在将包含一个在函数调用后不再存在的对象。
我错过了什么吗?
【问题讨论】:
您可能需要了解的一件事是,Java 中的“引用”与 C++ 中的“引用”非常不同。 Java 的引用概念在 C++ 中不存在(反之亦然)。 【参考方案1】:您错过了值语义这个强大的概念。就像var
是函数中的本地副本一样,std::vector
的设计使得在v.push_back(var);
之后,v
拥有var
的副本。这意味着可以使用v
的元素而不必担心它们来自哪里(除非SomeClass
的成员具有引用语义,或者以某种方式触及共享状态。)
【讨论】:
【参考方案2】:是的,您缺少 C++ 值语义。在 Java 中,向量只保存对象引用,对象值本身驻留在堆上,并在不再使用时被收集。在 C++ 中,向量保存对象值,因此实际上向量总是会保存自己的私有值,而与函数的局部值无关。即使您通过引用传递 var,vector 也会拥有自己的私有副本。将它们视为深层副本。
如果您不打算在 push_back 之后使用该值,您可能想在这里 push_back(std::move(var))
顺便说一句,当 var 在您的示例中按值传递时。
【讨论】:
以上是关于将函数参数添加到向量的主要内容,如果未能解决你的问题,请参考以下文章