Новое в C ++. Вопрос о постоянных указателях - PullRequest
5 голосов
/ 10 июля 2009

Я пытаюсь выучить C ++ с помощью некоторых веб-учебников. У меня нет доступного мне компилятора, иначе я бы попробовал это. Я не уверен, что подразумевается под указателем const. Означает ли это, что он всегда указывает на один и тот же адрес памяти? Зачем тебе это делать? Будет ли следующий код законным?

...
int * const aPointer = new int;
... //do something with aPointer
delete aPointer;
... //do something else, including possibly more 'new' statements
aPointer = new int;
...

Ответы [ 10 ]

18 голосов
/ 10 июля 2009

Простой способ вспомнить, как const работает с указателями, - помнить, что он всегда применяется ко всему, что находится слева от него, если только это не крайнее левое ключевое слово, в этом случае оно применяется справа.

Примеры:

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

const char * p;

Постоянный указатель на символ: Указатель нельзя изменить, чтобы он указывал на что-либо еще, но символ, на который он указывает, может изменить значение.

char *const p;

Постоянный указатель на постоянный символ: Указатель нельзя изменить, чтобы он указывал на что-либо еще, а символ, на который он указывает, не может изменить значение.

const char *const p;
9 голосов
/ 10 июля 2009

Const указатель может означать несколько разных вещей. Я рекомендую проверить C ++ FAQ Lite по этому вопросу.

Вы можете иметь:

const int* p;
int* const p;
const int* const p;

Все три означают разные вещи. Да, это немного сбивает с толку.

В вашем случае у вас есть второй, что означает, что у вас есть постоянный указатель на неконстантный объект. То есть вы можете изменить значение целого числа через указатель, но вы не можете изменить то, на что указывает указатель. Таким образом, код, который вы разместили, не будет законным.

3 голосов
/ 10 июля 2009

Вы не можете научиться водить машину, просто читая книги.

Получите себе компилятор C ++, если хотите изучать C ++. g ++ является бесплатным, а также Visual Studio 2008 Express Edition.

Что касается вашего вопроса, указатель const - это зона памяти, которая только готова. Пример: класс может предоставлять доступ только для чтения к внутреннему буферу.

Обратите внимание, что у вас также есть указатель const, который также является const, он же

const char * const p 

В этом случае даже значение указателя не может быть изменено.

2 голосов
/ 10 июля 2009

G'day,

Чтобы легко запомнить это, вы можете воспользоваться трюком, который Скотт Мейерс описывает в своей превосходной книге «Эффективный C ++» ( продезинфицированная ссылка Amazon )

Вы проводите линию через объявление, где расположена звездочка.

  • Если ключевое слово const появляется слева от строки, вы не можете изменить значение элемента, на который указываете.
  • Если ключевое слово const появляется справа от строки, вы не можете изменить указатель так, чтобы он указывал на другое местоположение.
  • Если const появляется с обеих сторон, вы не можете изменить указатель и изменить значение того, на что указываете.

Кстати, эта книга отличная, и хотя она не для начинающих, она определенно является способом поднять ваши знания C ++ на новый уровень! Настоятельно рекомендуется.

НТН

ура

1 голос
/ 10 июля 2009

Ваш код не является законным. Вы не можете присвоить aPointer (за исключением использования инициализации в стиле копирования, которая на самом деле не является присваиванием, даже если оно выглядит так), если aPointer объявлено как const таким образом.

Но обычно, когда люди говорят «константный указатель», они имеют в виду const int * aPointer, а не int * const aPointer, как в вашем коде. Весь интернет объяснит разницу одним махом. Насколько я знаю, термин «указатель констант» не определен в стандарте, поэтому мы можем сделать это, хотя это может сбить с толку. «Указатель на константу» будет однозначным описанием, а указатель на констант используется гораздо чаще, чем указатель, который сам является константой.

Указатель-который-сам-const используется для ссылки на что-то, где вы не захотите, чтобы указатель ссылался на другую вещь в любой момент своей жизни. Например, this является указателем, который сам является константой, потому что «этот объект» остается тем же самым объектом при выполнении функции-члена. Язык C ++ решил не позволять вам частично решить, что вы хотите присвоить какое-то другое значение this, чтобы оно ссылалось на какой-то другой объект. В C ++ ссылки также часто служат этой цели, поскольку их нельзя «пересаживать» для изменения реферрана.

1 голос
/ 10 июля 2009

Константный указатель означает, что вы можете изменить значение переменной, на которую указывает указатель, но вы не можете изменить место нахождения указателя. Я сам не часто их использую, но обычное применение для константных указателей заключается в определении конкретных сегментов памяти, к которым вам нужно обратиться. См. этот вопрос для получения дополнительной информации.

Кроме того, вы должны попытаться установить компилятор на свой компьютер, если можете. Я много раз доказывал, что человеческий мозг - плохой компилятор C ++.

0 голосов
/ 10 июля 2009

Как уже указывалось, возможно самый распространенный указатель const -

const char* p;

Переменная p может изменяться, но данные, на которые указывает p, неизменяемы.

Однако перемещение ключевого слова const слева от звездочки не меняет смысла объявления:

char const* p;

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

char const* const* p;

Опять же, переменная p может измениться, и указанные данные не могут быть изменены. Кроме того, данные объявляются как константные указатели, что означает, что они указывают на данные, которые нельзя изменить.

Наиболее распространенная запись для этого типа -

const char* const* p;

Размещение ключевого слова const непосредственно слева от изменяемой звездочки (или амперсанда для справки) позволяет легко создавать сложные типы, включающие ключевое слово const. Например, указатель на константные указатели:

char const** p;

и константный указатель на указатели:

char* const* p;

Не забывайте «читать» объявления указателей справа налево и не объявляйте более одного указателя в каждом операторе, чтобы избежать путаницы.

0 голосов
/ 10 июля 2009

У меня нет доступного компилятора, иначе я бы попробовал это

Каждый имеет в своем распоряжении компилятор C ++: http://www.online -compiler.com

Есть много других, но, похоже, это работает ...

0 голосов
/ 10 июля 2009

Поскольку вы новичок в C ++, для ответа на этот вопрос и многих других вопросов, которые у вас могут возникнуть или нет, ознакомьтесь с C ++ FAQ

0 голосов
/ 10 июля 2009

В вашем коде указатель не может двигаться, но указанные данные могут измениться.

Это разрешено до первого удаления. Последующее новое не будет работать, потому что это присвоение константе.

Это относительно необычно видеть, чаще встречается, когда данные, на которые указывают, неизменны, но указатель может двигаться.

int bar;
int baz;
const int * foo = &bar;
*foo = 4; // illegal
foo = &baz; // legal

с указателем и значением const является обычным для строк

const wchar_t * const myString = L"String that will never change.";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...