2009-07-10 2 views
5

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

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

ответ

1

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

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

3

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

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

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

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

const char * const p 

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

+3

Это сообщение путается и не различает четко, когда значение const и когда указатель const. –

+0

В любом случае требуется больше, чем чтение сообщения, чтобы четко понимать понятие. –

+1

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

0

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

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

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

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

, имеющие как указатель и значение будучи сопзЬ является общим со строками

const wchar_t * const myString = L"String that will never change."; 
9

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

Вы можете:

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

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

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

18

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

Примеры:

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

const char * p; 

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

char *const p; 

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

const char *const p; 
+0

Во втором и третьем примерах есть неуместная константа. Вы имеете в виду char * const p; –

+0

Спасибо, что поймали это. –

1

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

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

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

0

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

0

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

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

есть много других, но это S EEMS работать ...

2

G'day,

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

Вы рисуете линию через объявление, в котором находится звездочка.

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

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

HTH

веселит,

+0

При обучении C я называл это «сокрытием». –

+0

Эти правила (и эта книга) превосходны. –

0

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

const char* p; 

переменная р может измениться, но точки данных Рдо является unmodifable ,

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

char const* p; 

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

char const* const* p; 

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

Более общего обозначение этого типа

const char* const* p; 

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

char const** p; 

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

char* const* p; 

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

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