提问人:user3809200 提问时间:2/20/2018 最后编辑:Biffenuser3809200 更新时间:2/20/2018 访问量:721
向量添加函数参数
Adding function parameters to a vector
问:
来自Java背景,我对C++如何允许按值传递对象感到困惑。我对对象何时按值传递有一个概念上的疑问:
void add_to_vector(vector<SomeClass>& v, SomeClass var) {
v.push_back(var);
}
这在概念上正确吗?这就是为什么我觉得这是错误的:是按值传递的,对象的内存将在函数调用的堆栈上分配。然后将其添加到向量中。在函数调用结束时,堆栈将被清除,因此被引用的对象也将被清除。因此,vector 现在将包含一个对象,该对象在函数调用后不再存在。var
var
我错过了什么吗?
答:
10赞
juanchopanza
2/20/2018
#1
你错过了价值语义的强大概念。就像函数中的本地副本一样,被设计成在 之后,保存 的副本。这意味着可以使用元素 ,而不必担心它们来自哪里(除非具有具有引用语义的成员,或者以某种方式触及共享状态。var
std::vector
v.push_back(var);
v
var
v
SomeClass
5赞
bipll
2/20/2018
#2
是的,您缺少 C++ 值语义。在 Java 中,向量只保存对象引用,对象值本身驻留在堆中,并在不再使用时被收集。在 C++ 中,向量保存对象值,因此实际上向量总是独立于函数的局部值来保存自己的私有值。即使您通过引用传递了 var,vector 也会保留自己的私有副本。将它们视为深度副本。
顺便说一句,如果你不打算在push_back之后使用该值,那么当你的示例中按值传递 var 时,你可能想在这里。push_back(std::move(var))
评论