我有一个函数可以处理给定的向量,但如果没有给出则可能会创建这样的向量。
针对这种情况,即函数参数是可选的,我看到了两种设计选择:
将其变为指针并默认设置为 NULL
:
void foo(int i, std::vector<int>* optional = NULL) {
if(optional == NULL){
optional = new std::vector<int>();
// fill vector with data
}
// process vector
}
或者有两个具有重载名称的函数,其中一个函数省略了参数:
void foo(int i) {
std::vector<int> vec;
// fill vec with data
foo(i, vec);
}
void foo(int i, const std::vector<int>& optional) {
// process vector
}
有没有理由更喜欢其中一个解决方案?
我稍微更喜欢第二个解决方案,因为我可以将向量作为const
引用,因为它只会被读取而不会被写入。此外,接口看起来更清晰(NULL
难道不是一种hack吗?)。由间接函数调用导致的性能差异可能已经被优化掉了。
然而,我经常在代码中看到第一个解决方案。除了程序员的懒惰之外,还有什么强有力的理由支持它吗?