Недавно я обнаружил, что вы можете добавлять и удалять cv-квалификатор из аргументов значения в объявлении функции и ее реализации. Например:
F.h
f(const int i);
F.cpp
f(int i) { i++; }
test.cpp
#include "F.h"f(0);
Будет вызвана реализация f (int i). Поскольку это копия по значению, я не вижу проблем с компиляцией кода. Но может ли кто-нибудь представить себе случай, когда как-то полезно добавить Const к декларации, как сделано выше? Почему это вообще возможно? Может быть, кто-то может дать более полезное приложение?
Спецификаторы CV верхнего уровня для аргументов функции игнорируются, то есть они не являются частью сигнатуры функции. Скорее, если вы будете, они являются частью реализация функции, так как они квалифицируют местный переменные соответствующие параметрам формальной функции. Поэтому, если вас это устраивает, вы можете указать параметры функции в определении функции:
int power(int val, int n, int base);
int power(int val, int n, const int base)
{
while (n --> 0) val *= base;
return val;
}
Тем не менее, некоторые люди считают обидным, если определение имеет параметры функции, отличающиеся от декларации. Это вопрос вкуса и стиля. Преимущества определения аргументов, вероятно, невелики, хотя в документировании есть некоторая ценность для реализации того, что вы не планируете изменять переменную.
Некоторым людям нравится указывать в своем определении, что они не собираются изменять параметр, даже если он виден только локально. Например:
void f(int);
void f(int const);
void f(int const x) {
x = 3; // ERROR!
}
Определение — это функция, которая была только что объявлена, то есть в сигнатуре нет никаких изменений (ну, если только вы не используете CC Sun, который фактически принимает const
во имя искаженного имени, но это просто ошибка). Все три подписи объявляют одну и ту же функцию и const
влияет только на тело определения, если оно используется в объявлении определения.