Редагувати
Як зазначив М., від параметрів в прототипахconst
ігноруються. Відредаговане джерело оригінальної відповіді (див. Нижче) показує це:
float correct(float const value);
float erroneous(float const value);
float changer(float value);
float correct(float value) {
return -value;
}
float erroneous(float value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
Немає повідомлення про помилку
У будь-якому випадку я залишу оригінал на місці, сподіваючись, що це може допомогти.
Оригінал
Параметр const
at робить цей параметр доступним лише для читання всередині функції.
Наприклад:
float correct(float const value) {
return -value;
}
float erroneous(float const value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
Це джерело не буде компілюватися без повідомлення про помилку.
Функція correct()
прочитає задане значення, змінить його знак та поверне заперечне значення.
erroneous()
Здається, функція ефективно виконує те саме, за винятком присвоєння параметру. Але оскільки параметр const
такий, це заборонено.
Далі функція changer()
буде працювати як обидві раніше, але вона не дає помилок.
Давайте подивимось на сайт для викликів:
float f = 3.14159;
float g = correct(f); // or erroneous(f) or changer(f)
Змінна, f
наведена як аргумент, буде скопійована в параметр value
. Це ніколи не зміниться, навіть якщо changer()
його покличуть.
Ви можете розглянути параметри як певні локальні змінні. Насправді вони здебільшого обробляються таким чином у створеному машинному коді.
Отже, чому ви бачите const
іноді? Ви бачите це, якщо вказівник визначений як параметр.
Якщо ви не хочете, щоб значення, вказане на зміну, потрібно додати const
; але робіть це у правильному положенні!
void effective(int const * pointer);
void futile(int * const pointer);
void possible_but_overly_restricted(int const * const pointer);
const
тут зайве, що ти уявляєш, що відбувається?