2016-01-14 8 views
0

Я новичок в C++ и пытаюсь изучить концепцию указателя. Я смущен, почему третье и четвертое высказывания приводят к ошибкам, в то время как первая и вторая работают просто отлично. Заранее благодарю за любую помощь!Почему int * const p1; приводит к ошибке, в то время как int * p1; работает просто отлично

int *p1; //Ok 
const int *p1;//Ok 
int *const p1; //error: default initialization of an object of const type 'int *const' 
const int *const p1; //error: default initialization of an object of const type 'const int *const' 

p.s-- Я понимаю, что это хорошая практика, чтобы инициализировать все указатели при объявлении их или, по крайней мере, установить их значение nullptr или 0. Я задал этот вопрос, потому что я хочу, чтобы понять концепцию позади него.

+3

Возможный дубликат [Почему переменные const должны быть инициализированы сразу?] (Http://stackoverflow.com/questions/8440381/why-do-const-variables-have-to-be-initialized-right- далеко) – Drop

ответ

3

В определении должны быть инициализированы типы неклассов с константой верхнего уровня.

Линии 3 и 4 имеют верхний уровень const, в том смысле, что p1 не может быть изменен. Строка 2 не имеет верхнего уровня const; p1может быть изменен, но int он указывает на не может.

4

Последние два утверждения объявляют, что указатель сам по себе является постоянным. И вы не дали им ценностей. Что делает их чертовски бесполезными, так как они никогда не могут быть изменены (и если они являются переменными класса стека или класса, они даже не имеют определенного значения, например NULL, поэтому они буквально бесполезны).

0

Это не вопрос хороших практик.
Вы объявляете пару константных указателей на int и const int (см. here для более подробной информации), в обоих случаях вы должны инициализировать их при их определении.