来自Java背景我对C ++如何允许按值传递对象感到困惑。关于何时通过值传递对象,我有一个概念上的疑问:
void add_to_vector(vector<SomeClass>& v, SomeClass var) {
v.push_back(var);
}
这在概念上是否正确?这就是为什么我觉得这是错误的:var
正在按值传递,对象的内存将在函数调用的堆栈上分配。然后将其添加到矢量中。在函数调用结束时,将清除堆栈,因此var
引用的对象也将被清除。因此,vector现在将包含一个在函数调用后不再存在的对象。
我错过了什么吗?
答案 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。