Указатель на константу

JackARoe
Дата: 17.01.2015 09:44:21
Привет.
Читаю про С++ и не понимаю вот чего:
int i = 123;
const int* pi = &i;
*pi = 456; // здесь ошибка компиляции - это понятно
i = 789;    // а здесь ошибки нет

Т.е. можно (ну, правда, не напрямую) изменить значение объекта.
Это из разряда "сделать можно, но никто никогда так не делает", "говнокод" и т.д.???
Или чего-то не догоняю?
Dima T
Дата: 17.01.2015 10:06:55
const обычно используют для передачи указателей в параметрах, это указывает на то что вызываемая функция не изменит значения по указателю. Ну и компилятор контролирует чтобы это не произошло.

void f(const int* x)
{
	printf("%d\n", *x);
	//*x = 25;
}

int main(int argc, char **argv)
{
	int x = 10;
	f(&x);
	return 0;
}

Раcкомментируй строку *x = 25; и не скомпилируется.
Dimitry Sibiryakov
Дата: 17.01.2015 11:04:03

JackARoe
Или чего-то не догоняю?

Ты не догоняешь, что у тебя нет константы. У тебя есть обычная переменная и вполне
естественно, что её значение можно изменять. Объяви static const int i и почувствуй разницу.

Posted via ActualForum NNTP Server 1.5

JackARoe
Дата: 17.01.2015 11:15:13
вроде утряслось. это помогло
const обычно используют для передачи указателей в параметрах...
....
у тебя нет константы. У тебя есть обычная переменная

Дмитрии, спасибо
mayton
Дата: 17.01.2015 12:36:16
#define pi 123
MasterZiv
Дата: 17.01.2015 12:56:56
JackARoe
Т.е. можно (ну, правда, не напрямую) изменить значение объекта.


У тебя объект i объявлен как

int i;


почему же его нельзя менять ?

JackARoe
Это из разряда "сделать можно, но никто никогда так не делает", "говнокод" и т.д.???
Или чего-то не догоняю?


Нет, это из разряда "ты чего-то не догоняешь".
Через неконстантную ссылку и указатель объект менять можно.
Через константную ссылку и указатель -- нельзя.
Точнее надо говорить так: ссылка на константный объект, указатель на константный объект,
потому что ещё и указатель может быть сам константный.
JackARoe
Дата: 17.01.2015 13:24:24
MasterZiv,
ага, осознал уже. и вам спасибо.
а вот глубину комментария mayton'а не осознал - это типа если мне нужно такое ничем неизменяемое значение, то определять его дефайном?
mayton
Дата: 17.01.2015 13:48:43
Это классика брат. Как раз для самых неизменяемых констант.
MasterZiv
Дата: 17.01.2015 19:12:08
JackARoe
MasterZiv,
ага, осознал уже. и вам спасибо.
а вот глубину комментария mayton'а не осознал - это типа если мне нужно такое ничем неизменяемое значение, то определять его дефайном?


в общем это шутка такая.
Basil A. Sidorov
Дата: 17.01.2015 20:32:10
mayton
Это классика брат. Как раз для самых неизменяемых констант.
С появлением ключевого слова const использовать директиву препроцессора define нужно осмысленно, а не потому, что "классика".