将功能参数添加到向量

Adding function parameters to a vector

本文关键字:向量 添加 参数 功能      更新时间:2023-10-16

来自Java背景我与C 允许按值传递对象的方式相混淆。我对何时按值传递对象有一个概念上的疑问:

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

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

我想念什么吗?

您错过了 value语义的强大概念。就像var是该函数中的本地副本一样,std::vector的设计使得在v.push_back(var);之后,v持有var的A 副本。这意味着可以使用v的元素,而不必担心它们来自哪里(除非SomeClass具有带有参考语义的成员,或以某种方式或其他触摸共享状态。(

是的,您缺少C 值语义。在Java中,向量仅保存对象引用,对象值本身位于堆上,不再使用时收集。在C 中,向量持有对象值,因此实际上始终将其独立于函数本地的私人价值保存其自己的私人价值。即使您通过引用通过VAR,Vector也会拥有自己的私人副本。将它们视为深副本。

您可能需要在此处 push_back(std::move(var)) btw,当通过示例中通过值传递var时,如果您不打算在push_back之后使用该值。