У меня есть функция, которая обрабатывает данный вектор, но может также создать сам такой вектор, если он не задан.
Я вижу два варианта дизайна для такого случая, когда параметр функции является необязательным:
Сделать указатель и 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
просто взломать?). И разница в производительности, вызванная косвенным вызовом функции, вероятно, оптимизируется.
Тем не менее, я часто вижу первое решение в коде. Есть ли веские причины, чтобы предпочесть это, кроме лени программиста?