Констебля и других животных

Возможный дубликат:
в чем разница между const int *, const int * const, int const *


У меня есть код cpp, с которым у меня проблемы с чтением. определяется класс B теперь, я понимаю первые две строки, но остальные недостаточно ясны.
это строка "B const * pa2 = pa1" определяет константную переменную типа B?
если да, то что делает следующая строка?

B a2(2);
B *pa1 = new B(a2);
B const * pa2 = pa1;
B const * const pa3 = pa2;

Кроме того, у меня возникли проблемы с выяснением разницы между этими двумя:

char const *cst = "abc";
const int ci = 15;


спасибо

0
источник поделиться
4 ответа

Этот код объявляет указатель на константу B - другими словами, он не может использоваться для изменения значения того, на что он указывает:

B const * pa2 = pa1;

В качестве альтернативы следующий код объявляет константный указатель на константу B - поэтому pa3 не может использоваться для изменения значения того, на что он указывает, и его нельзя изменить, чтобы указать на что-то еще:

B const * const pa3 = pa2;

Эта страница содержит пояснения указателей const.

Чтобы ответить на второй вопрос,

char const *cst = "abc"; - объявляет указатель на константу char - в этом случае это строка "abc".

const int ci = 15; - объявляет постоянное целое число 15, которое нельзя изменить.

+1
источник

Взято из С++ FAQ lite:

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

  • Fred const * p означает "p указывает на константу Fred": объект Fred не может быть изменен с помощью p.
  • Fred * const p означает, что "p является указателем const на Fred": вы не можете изменить указатель p, но вы можете изменить объект Fred через p.
  • Fred const * const p означает "p - постоянный указатель на константу Fred": вы не можете изменить указатель p самостоятельно, и вы не можете изменить объект Fred через p.
+3
источник

Второй фрагмент кода показывает способ изменения порядка типа и константы без каких-либо изменений: порядок не имеет значения.

В первом фрагменте кода третья переменная "const" означает, что вы не можете изменить объект, на который указывает этот указатель. В том же фрагменте кода последняя переменная other const означает, что вы не можете повторно переместить указатель, чтобы впоследствии указывать на другой объект. Это, в этом отношении, постоянная переменная и указатель, который не позволяет изменять объект, на который указывает.

Чтобы проиллюстрировать вопрос о втором фрагменте кода с использованием переменных первого фрагмента кода - вы можете изменить порядок типа и "const" в первом фрагменте кода для третьей и следующей переменных, не делая ничего другого:

const B * pa2 = pa1; // Same
const B * const pa3 = pa2; // Same
0
источник

Основное правило в С++ заключается в том, что const применяет "константу" (вы не можете ее изменить) до части объекта до левой. Исключением является сам фронт строки объявления. Если const есть, он вместо этого применяется к части объекта справа.

Таким образом, строка:

B const * pa2 = pa1; 

Значит: "pa2 является указателем на постоянный объект типа B, с (указателем) pa1, назначенным как его начальное значение указателя".

Строка:

B const * const pa3 = pa2; 

Значит "pa3 является постоянным указателем на постоянный объект типа B. Он указывает на тот же объект, который мы инициализировали pa2, чтобы указать на."

Многим (если не большинству) людям нравится помещать const в начало строки, когда они могут, потому что им нравится способ чтения. Другие (сам и ваш автор кода включены) не любят иметь дело с синтаксическими исключениями и предпочитают поместить его вправо от своего объекта.

Для гораздо большей информации по этой теме см. этот вопрос: В С++ есть "const" после допустимого идентификатора типа?

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос