向向量添加函数参数 从java背景中,我混淆C++如何通过值传递对象。我对对象何时按值传递存在概念上的疑问: void add_to_vector(vector<SomeClass>& v, SomeClass var) { v.push_back(var); } void向向量添加向量(向量&v,SomeClass变量){ v、 推回(var); }

向向量添加函数参数 从java背景中,我混淆C++如何通过值传递对象。我对对象何时按值传递存在概念上的疑问: void add_to_vector(vector<SomeClass>& v, SomeClass var) { v.push_back(var); } void向向量添加向量(向量&v,SomeClass变量){ v、 推回(var); },c++,vector,parameter-passing,pass-by-value,C++,Vector,Parameter Passing,Pass By Value,这在概念上正确吗?这就是为什么我觉得这是错误的:var正在按值传递,对象的内存将在堆栈上分配给函数调用。然后将其添加到向量中。函数调用结束时,堆栈将被清除,因此var引用的对象也将被清除。因此,vector现在将包含一个在函数调用后不再存在的对象 我遗漏了什么吗?您遗漏了价值语义的强大概念。就像var是函数中的本地副本一样,std::vector设计为在v.push_-back(var)之后,v持有var的副本。这意味着, V的元素可以不用担心它们来自哪里(除非 SomeClass 具有引用语义

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


我遗漏了什么吗?

您遗漏了价值语义的强大概念。就像
var
是函数中的本地副本一样,
std::vector
设计为在
v.push_-back(var)之后
v
持有
var
的副本。这意味着,<代码> V<代码>的元素可以不用担心它们来自哪里(除非<代码> SomeClass <代码>具有引用语义的成员,或者以某种方式触及共享状态。)

< P>是的,您缺少C++值语义。在Java中,向量只保存对象引用,对象值本身驻留在堆上,不再使用时收集。在C++中,向量保持对象值,因此实际上向量总是独立于函数的局部值而保存其私有值。即使您通过引用传递var,vector也会保存自己的私有副本。将它们视为深度复制品


你可能想<代码> PUBSUBACK(STD::Actudio(var))<代码>这里BTW,当VAR在爪哇中被值传递时,如果你不打算在PurthSub后推后使用这个值。

你可能需要了解的一件事是,C++中的“引用”与C++中的“引用”有很大的不同。在C++中,java的引用概念不存在(反之亦然)。