2014-01-13 4 views
2

Я видел код, где люди будут использовать const в качестве параметра функции. Каковы преимущества использования const * vs const * const? Это может быть очень простой вопрос, но я был бы признателен, если бы кто-нибудь мог объяснить.Когда использовать const * versus const * const?

Bool IsThisNumberEqualToFive(int const * num) 
{ 
    return(Bool)(5 != num); 
} 

Bool IsThisNumberEqualToFive(int const * const num) 
{ 
    return(Bool)(5 != num); 
} 
+1

Немного связано: вы можете найти [этот ответ на предыдущий вопрос] (http://stackoverflow.com/questions/14562845/why-does-passing-char-as-const-char-generate-a-warning/ 14566215 # 14566215) интересный. не связанный напрямую с вашим вопросом, так что не обман, но проверьте список типов указателей и эффекты 'const'. – WhozCraig

ответ

6
  • В первом варианте вы обещаете вы не собираетесь писать в объект, который указывает на num
  • Во втором варианте вы обещаете, что и вы также предотвратить себя (т.е. IsThisNumber. .) от принятия num указывают на что-то еще.

То есть, во втором варианте сам указатель также const, в дополнение к pointee.

+0

Итак, в функции, например, где нам просто нужно проверить, истинно или нет утверждение (мы ничего не меняем внутри функции), мы должны использовать второй вариант? – user968000

+0

Технически это позволяет компилятору оптимизировать больше. На практике вы больше заботитесь о constee-level const. – cnicutar

+1

@ user968000 Лично я считаю, что верхний уровень 'const' как тот, который во второй функции почти бесполезен.Кто-то, вызывающий эту функцию, не заботится о том, выполняете ли вы '++ num;' внутри функции, но они, скорее всего, будут заботиться о том, чтобы вы не делали '* num = 42;', которые первая версия обещает вам выиграть «т. – Praetorian

2

Для параметра

int const * num // num is a pointer to const int. 

сопзЬ является защита num точек to.The программирования может изменить значение num но не *num. В то время как для

int const * const num // num is a const pointer to const int 

крайний левый const является защита num указывает на то время самый правый защищает указатель num это сам. В этом случае ни num, ни *num не изменится.

ПРИМЕЧАНИЕ: Понимание того, что делает

T const *p; // T is any valid type 

средства (более точно).
Это означает, что программа может использовать выражение p для изменения значения объекта-указателя, которое p обозначает, но не может использовать выражение *p, чтобы изменить значение любых объектов, которые может обозначить *p. Если программа имеет другое выражение e неквалифицированного типа, которое обозначает объект, который также обозначает *p, программа все еще может использовать e для изменения этого объекта.

+0

@ViktorLexington; В первом случае указатель можно изменить, но не значение, указанное указателем. Во втором примере вы правы. – haccks

1

Чем больше источники сообщают компилятору о том, что будет случилось с значений переменных (или лучше „не произойдет“, как можно было бы ожидать для const переменных) заранее, тем лучше компилятор может optmise.

Смежные вопросы