В соответствии с практикой использования функций, не являющихся членами, где возможно улучшить инкапсуляцию , я написал несколько классов, у которых есть объявления, которые выглядят примерно так:
void auxiliaryFunction(
const Class& c,
std::vector< double >& out);
Его цель - сделать что-то с открытыми функциями-членами c
и заполнить вектор выводом.
Вы можете заметить, что порядок аргументов напоминает порядок функций-членов Python, def auxiliaryFunction(self, out)
.
Однако есть и другие разумные способы выбора порядка аргументов: можно сказать, что эта функция напоминает операцию присваивания, out = auxiliaryFunction(c)
. Эта идиома используется, например, в
char* strcpy ( char* destination, const char* source );
Что если у меня есть другая функция, которая не напоминает несущественную функцию-член, то есть ту, которая инициализирует новый объект, который я создал:
void initializeMyObject(
const double a,
const std::vector<double>& b,
MyObject& out);
Итак, для согласованности, я должен использовать тот же порядок (последняя изменяемая переменная), что и в auxiliaryFunction
?
В общем, лучше выбрать (non-const , const)
вместо (const, non-const)
или только в определенных ситуациях? Есть ли какие-то причины для выбора, или я должен просто выбрать один и придерживаться его?
(Кстати, мне известно о руководстве по стилю Google , в котором предлагается использовать указатели вместо неконстантных ссылок, но это касается моего вопроса.)