关于传递参数在C++中如何工作的问题
Questions on how passing arguments works in C++
所以我是一个经验丰富的C程序员,经常用C++编程。这种语言有一些微妙之处,我从未对此有过信心。例如,传递论点的最佳方法。
例如,假设我有一个名为Object的黑盒类(据我们所知,它可能有很多成员变量),还有一个函数fn,它以Object实例的向量为参数。在我看来,有四种基本的方式可以通过:
void fn(vector<Object> vec);
void fn(vector<Object*> vec);
void fn(vector<Object> *vec);
void fn(vector<Object> &vec);
当然,我们也可以将这些功能结合起来。
我想确保我有这个直:
方法1将复制向量类,包括向量中每个Object实例的副本。这可能是一个巨大的过载,因此是糟糕的。
(这个我不太确定)方法2会复制vec的所有方法变量,但它只会复制每个Object实例的地址。我对向量类中包含的内容了解不多,不知道这是否可取。
方法3&4是相当直接的并且彼此相似,并且引入最小的开销。
所有这些都正确吗?考虑到我们对Object类一无所知,哪种方法是首选方法?
传递参数的首选方式是void fn(const vector<Object> &vec);
当然前提是你不修改它。在c++中使用指针,比如情况2和3,通常不是一个好的做法
现在版本1:void fn(vector<Object> vec);
通常会被认为是糟糕的,因为它是一个副本,但有时它是必要的。请记住,有时编译器能够在临时情况下使用副本省略来优化副本,如果副本没有被修改(但在这种情况下应该使用const-ref),
您所说的一切都是正确的。
如果无论如何都要在函数中复制矢量,或者如果要在fn
中修改vec
,但不修改原始副本,请使用#1。然后你可以把副本保存在里面,让编译器(可能)为你做副本。
如果要修改原始矢量(来自fn
外部),请使用#4。
如果您根本不想修改矢量,那么使用带有const
:的#4
void fn(const vector<Object> &vec);
不要使用#2,因为将指针放入向量会非常困难。存储器将需要是new
d和delete
d,并且它将容易出错。[强制共享ptr注释]。
您的#3不是惯用的C++。这很好,但在这种情况下,惯用的C++会避开指针而使用引用。
这一切都是正确的。方法2确实会复制vec,因为它的元素是指向Object
的指针,所以它只会复制这些指针,而不会复制实际对象。这与向Object
传递指针数组没有太大区别。
一般来说,拥有指针向量是不受欢迎的。当矢量超出范围时,这些指针将不会自动删除。你必须确保自己删除它们。如果您的代码在此之前的任何时候抛出异常,那么您是否仍会发生内存泄漏。
如果对象很小,则应该使用对象向量,而不是指针。如果对象很大,则应该使用智能指针向量。
基本上你做对了,其他人都给出了很好的答案和评论。我只想添加两条评论:
1) 如果你有
std::vector<Object> v;
那么,很明显,您不能为过载void fn(vector<Object*> vec);
调用fn(v)
。
2) 你说:
"我对向量类中包含的内容了解不够"。。。
std::vector
最流行的实现只有三个指针作为数据成员,并且复制这三个指针的成本非常小。但是,当您复制std::vector
时(如果它的复制构造函数是编译器生成的),会发生这种情况,而不是。实际上std::vector
有一个复制构造函数,它(正如您所说)复制原始std::vector
的所有元素。这也涉及到内存分配,并且可能是非常昂贵的操作。
- 如何解决在负数的情况下程序以相同方式工作的问题?
- 餐饮哲学家问题 - 只有 2 个线程工作
- 如何使这个 Foor 循环在这个问题中工作?
- rand()函数在特定问题中的工作
- 我在循环中的循环中遇到问题,无法正常工作
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 我在while循环中遇到问题,我只是无法弄清楚为什么它无法按预期工作
- POSIX 的问题。线程无法正常工作
- Qt Ros工作区中的QVTKWidget问题
- 而循环不工作终止问题
- 解决死锁问题,在主线程中等待多个工作线程完成 (C++11)
- (c++)无法让 void 函数工作,主.cpp内部的几行也有问题
- nqueens问题的C 递归解决方案无法正常工作
- 虽然这个简单的 C++ 程序可以打印 2 的幂,但它有很多问题时可以工作
- 在打印出动态分配的数组中的前两个数字时遇到问题,其他数字工作正常
- 如何使其工作,两个类的问题
- 回文字符串问题:为什么我必须放+1而不是-1才能让这个代码工作
- 我的 IF 语句中存在问题,否则无法正常工作
- 在 ROS 工作区中使用 catkin_make 时 Qt 出现问题
- 有问题使循环工作与功能相结合