Я знаю, что мало вопросов о правильности констант, когда утверждается, что для объявления функции и ее определения не нужно согласовывать значения параметров. Это связано с тем, что постоянство значения параметра имеет значение только внутри функции. Это нормально:
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
Это действительно лучший способ? Потому что я никогда не видел, чтобы кто-нибудь делал это. Я видел эту цитату (не уверен в источнике) в других местах, где это обсуждалось:
"На самом деле, для компилятора сигнатура функции одинакова независимо от того, включена эта константа перед параметром значения или нет."
"Избегайте передачи параметров const по значению в объявлениях функций. При этом оставьте параметр const в том же определении функции, если он не будет изменен."
Во втором абзаце говорится, что не следует указывать const в объявлении Я предполагаю, что это потому, что постоянство параметра-значения не имеет смысла как часть определения интерфейса. Это деталь реализации.
Исходя из этой рекомендации, также рекомендуется ли для значений указателя параметры указателя? (Это не имеет смысла для параметра ссылки, поскольку вы не можете переназначить ссылку.)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i;
}
Резюме: Создание параметров-значений полезно для выявления некоторых логических ошибок. Это лучшая практика? Вы идете до крайности, оставляя const из файла заголовка? Это так же полезно, чтобы константные значения указателя? Почему или почему нет?
Некоторые ссылки:
C ++ const ключевое слово - использовать свободно?
Использование const для параметров функции
Пример использования параметров const:
bool are_ints_equal(const int i, const int j) {
if (i = j) { // without the consts this would compile without error
return true;
} else {
return false;
}
// return i = j; // I know it can be shortened
}