Зачем нужны константные параметры функции?
Зачем нужны константные параметры функции?
Нужен реальный пример использования.
То есть когда стоит писать, например, так
void foo(const int x);
а не так
void foo(int x);
upd
Не является дубликатом Const модификатор в сигнатуре функции. Там вопрос про то, почему нельзя перегрузить, у меня вопрос "зачем нужны". В ответах не увидел ответ на свой вопрос.
Ответы (3 шт):
использовать константные аргументы когда они read only в данной функции это хороший стиль программирования, который дает знать, что данная функция не изменяет аргументов, и если попытаешься их менять при написании функции ide и компилятор будут подсказывать тебе об этом, например:
здесь аргумент value только на чтение и это сразу понятно по контексту, и всем программистам будет очевидно, что эта функция как берет аргумент так его и печатает не меняя его внутри
void print(const int value)
{
std::cout << value << '\n';
}
также дело обстоит с методами классов, в set_x мы хотим просто скопировать аргумент x, а в get_x модификатор const говорит программистам, что метод не изменяет состояние обьекта
class Dummy
{
private:
int x;
public:
void set_x(const int x) { this->x = x; }
int get_x() const { return x; }
};
Чтобы нельзя было изменить значение параметра внутри функции:
Можно изменить:
void yes(int i) {
i++;
}
Нельзя (ошибка MinGW cannot assign to variable 'i' with const-qualified type 'const int'):
void no(const int i) {
i++;
}
В качестве примера использования именно const int вы вряд ли найдете, а вот передача константной ссылки, или указателя имеет самое, что ни на есть, частое и широкое применение, и примеров сколько угодно
Достаточно представить, что параметр функции - это по сути локальная (для функции) переменная. И тогда исходный вопрос просто превращается в "Зачем нужны константы?". Ответ на который, как мне кажется, должен быть очевиден:
Когда нужно показать и гарантировать, что значение не будет изменяться после инициализации.
В достаточно коротких функциях (в пределах пары десятков строк) обычно сразу видно как используется параметр, поэтому даже там, где он не предполагает изменения, обычно const не добавляют. Зачем засорять код лишней константностью, когда и так всё предельно ясно. Но вполне можно допустить и ситуацию, прописанную в код-стайле проекта, требующую писать этот const во всех возможных для этого случаях.
Есть и вовсе основоположники мнения, что по умолчанию всё должно быть константным (переменные, функции, параметры функций и т.д.), и только если возникает потребность что-либо изменить, оно должно быть помечено специальным признаком. Однако, в C++ такой способ не получил развития. А люди, которые хотели бы такого поведения, просто добавляют const везде, где только можно. Иногда здесь можно неожиданно получить фейл, например:
const T c = f();
g(std::move(c));
Из-за константности c вместо перемещения получим копирование.