Помните шаблон if(NULL == p)
?
Есть много людей, которые скажут: «Вы должны написать такой код»:
if(NULL == myPointer) { /* etc. */ }
вместо
if(myPointer == NULL) { /* etc. */ }
Обоснование заключается в том, что первая версия защитит кодировщик от опечаток, таких как замена "==" на "=" (потому что запрещено присваивать значение постоянному значению).
Следующее может считаться расширением этого ограниченного if(NULL == p)
шаблона:
Почему постоянные параметры могут быть полезны для кодера
Независимо от типа, «const» - это спецификатор, который я добавляю, чтобы сказать компилятору, что « я не ожидаю, что значение изменится, поэтому отправьте мне сообщение об ошибке компилятора, если я лгу» ».
Например, этот код будет показан, когда компилятор может мне помочь:
void bar_const(const int & param) ;
void bar_non_const(int & param) ;
void foo(const int param)
{
const int value = getValue() ;
if(param == 25) { /* Etc. */ } // Ok
if(value == 25) { /* Etc. */ } // Ok
if(param = 25) { /* Etc. */ } // COMPILE ERROR
if(value = 25) { /* Etc. */ } // COMPILE ERROR
bar_const(param) ; // Ok
bar_const(value) ; // Ok
bar_non_const(param) ; // COMPILE ERROR
bar_non_const(value) ; // COMPILE ERROR
// Here, I expect to continue to use "param" and "value" with
// their original values, so having some random code or error
// change it would be a runtime error...
}
В тех случаях, которые могут произойти либо из-за опечатки кода, либо из-за ошибки при вызове функции, будет обнаружен компилятор, что является хорошей вещью .
Почему это не важно для пользователя
Бывает, что:
void foo(const int param) ;
и
void foo(int param) ;
имеют одинаковую подпись.
Это хорошо, потому что, если разработчик функции решает, что параметр считается внутри функции const, пользователь не должен и не должен знать это.
Это объясняет, почему в моих объявлениях функций для пользователей отсутствует const:
void bar(int param, const char * p) ;
чтобы объявление было как можно более четким, в то время как мое определение функции добавляет его как можно больше:
void bar(const int param, const char * const p)
{
// etc.
}
, чтобы сделать мой код максимально надежным.
Почему в реальном мире это может сломаться
Однако меня укусил мой шаблон.
На неработающем компиляторе, который останется анонимным (имя которого начинается с " Sol " и заканчивается на " aris CC "), две вышеуказанные подписи могут рассматриваться как разные ( в зависимости от контекста), и, таким образом, ссылка во время выполнения будет возможно сбоем.
Поскольку проект был скомпилирован также на платформах Unix (Linux и Solaris), на этих платформах оставались неопределенные символы для разрешения при исполнении, что вызывало ошибку времени выполнения в середине выполнения процесса.
Итак, поскольку я должен был поддерживать указанный компилятор, я прекратил загрязнять даже мои заголовки константными прототипами.
Но я все же считаю этот шаблон добавления const в определении функции хорошим.
Примечание: у Sun Microsystems даже были шары, чтобы скрыть их испорченное искажение с ", это - образец зла в любом случае, поэтому вы не должны использовать его " объявление. см http://docs.oracle.com/cd/E19059-01/stud.9/817-6698/Ch1.Intro.html#71468
Последнее замечание
Следует отметить, что Бьярн Страуструп, похоже, был против рассмотрения void foo(int)
того же прототипа, что и void foo(const int)
:
Не все принятые функции, на мой взгляд, являются улучшением. Например, [...] правило, что void f (T) и void f (const T) обозначают одну и ту же функцию (предложено Томом
Слива по соображениям совместимости с С) [имеют] сомнительное отличие от того, что проголосовали за С ++ «за мое мертвое тело».
Источник: Бьярне Страуструп
Развитие языка в реальном мире: C ++ 1991-2006 , 5. Особенности языка: 1991-1998 , стр. 21.
http://www.stroustrup.com/hopl-almost-final.pdf
Забавно, что Херб Саттер предлагает противоположную точку зрения:
Указание: Избегайте константных параметров передачи в значениях в объявлениях функций. Все же сделайте параметр const в том же определении функции, если он не будет изменен.
Источник: Херб Саттер
Исключительно C ++ , Item 43: Const-Correctness , p177-178.