本文是对 C++关于vector做返回值的引用细节 的延申
问题一:使用vector作为函数返回值时,加&与不加&有什么区别
在C++中,当函数返回一个vector
时,可以选择在返回类型中使用引用(&)或者不使用引用的方式。这两种方式有一些区别,主要涉及到拷贝构造和性能。
1.使用引用 (&):
std::vector<int>& functionWithRefReturn() { std::vector<int> myVector = {1, 2, 3, 4, 5}; return myVector; }
- 优点: 避免了拷贝构造,返回的是原始向量的引用,没有额外的开销。
- 缺点: 可能导致悬空引用(dangling reference)问题,因为函数结束后局部变量
myVector
将被销毁,但引用仍然指向已经被销毁的对象。所以这种写法是错误的。(这种写法报错)
2.不使用引用:
std::vector<int> functionWithoutRefReturn() { std::vector<int> myVector = {1, 2, 3, 4, 5}; return myVector; }
- 优点: 返回的是原始向量的副本,避免了悬空引用的问题。
- 缺点: 有一定的性能开销,因为需要进行向量的拷贝构造。
在某些情况下,还可以使用移动语义(move semantics)来提高性能。C++11引入了右值引用和移动构造函数,可以通过std::move
将临时对象的所有权转移给返回的对象,减少了拷贝的开销。示例如下:
std::vector<int> functionWithMoveReturn() { std::vector<int> myVector = {1, 2, 3, 4, 5}; return std::move(myVector); }
在使用移动语义时,需要注意避免悬空引用的问题,确保不再使用已经移动的对象。
标签:std,myVector,对类,vector,引用,使用,拷贝 From: https://www.cnblogs.com/imreW/p/18124454