lau*_*ent 1 c++ reference object stdvector
我的LastQueryInfo lastQuery班上有一个叫做的对象.每次这个对象改变时,我都会将它添加到一个名为的向量中history.
最初,当我这样history.push_back(lastQuery)做时,我不知道会发生什么 - 矢量是否会制作对象的副本?或者是否会继续提及它?所以,如果以后我修改lastQuery,历史矢量中的所有对象(假设它们都是引用)将被修改?
经过一些测试,我发现history.push_back(lastQuery)确实会制作一个对象的副本,然后将其添加到矢量中.但是如果不做任何测试我怎么知道呢?我怎么知道C++什么时候要复制,什么时候要添加实际的对象?
std::vector 总是存储任何你的副本†push_back().因此,修改传入的值不会影响向量中存储的值.它不像Java或C#,Object o;它实际上是对象的引用,并且对象一直存在,直到垃圾收集器到来并在最后一次引用它时消失它.在C++中,Object o; 是实际的对象,它将在其范围的末尾消失.
因此,如果std::vector仅存储对您的对象的引用push_back(),那么对于这样的事情将完全没用:
std::vector<int> numbers;
for(/* loop condition */) {
int number = GetUserInput();
numbers.push_back(n);
}
Run Code Online (Sandbox Code Playgroud)
由于number将在循环结束时消失,numbers如果std::vector通过仅存储引用来实现,则将保留对不存在的内容的引用.如果std::vector实际存储了值,即使在循环之后也可以访问它们.
† C++ 11支持移动语义,所以如果你推回的东西实际上是一个很快就会消失的东西,它会将对象的内部移动到矢量存储而不是复制.您还可以明确地使用C++ 11 std::move()来"强制"移动push_back().但是vector会在每个其他情况下复制该值.这是优化矢量性能的实现细节.