将函数参数添加到向量

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 在您的示例中按值传递时。

【讨论】:

以上是关于将函数参数添加到向量的主要内容,如果未能解决你的问题,请参考以下文章

将向量作为函数参数传递

如何将多个参数作为单个向量传递给函数?

提升精神:将结果复制到字符串向量中

如何将向量传递给函数参数(我需要指针吗?)

将构造函数传递给函数

将向量数组作为函数参数传递以更改原始值