Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на константу / 21 сообщений из 21, страница 1 из 1
17.01.2015, 09:44
    #38856631
JackARoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Привет.
Читаю про С++ и не понимаю вот чего:
Код: plaintext
1.
2.
3.
4.
int i = 123;
const int* pi = &i;
*pi = 456; // здесь ошибка компиляции - это понятно
i = 789;    // а здесь ошибки нет


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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; и не скомпилируется.
...
Рейтинг: 0 / 0
17.01.2015, 11:04
    #38856647
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
JackARoeИли чего-то не догоняю?
Ты не догоняешь, что у тебя нет константы. У тебя есть обычная переменная и вполне
естественно, что её значение можно изменять. Объяви static const int i и почувствуй разницу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.01.2015, 11:15
    #38856649
JackARoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
вроде утряслось. это помогло
const обычно используют для передачи указателей в параметрах...
....
у тебя нет константы. У тебя есть обычная переменная
Дмитрии, спасибо
...
Рейтинг: 0 / 0
17.01.2015, 12:36
    #38856677
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Код: plaintext
1.
#define pi 123
...
Рейтинг: 0 / 0
17.01.2015, 12:56
    #38856684
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
JackARoeТ.е. можно (ну, правда, не напрямую) изменить значение объекта.


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

Код: plaintext
1.
int i;



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

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

Нет, это из разряда "ты чего-то не догоняешь".
Через неконстантную ссылку и указатель объект менять можно.
Через константную ссылку и указатель -- нельзя.
Точнее надо говорить так: ссылка на константный объект, указатель на константный объект,
потому что ещё и указатель может быть сам константный.
...
Рейтинг: 0 / 0
17.01.2015, 13:24
    #38856692
JackARoe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
MasterZiv,
ага, осознал уже. и вам спасибо.
а вот глубину комментария mayton'а не осознал - это типа если мне нужно такое ничем неизменяемое значение, то определять его дефайном?
...
Рейтинг: 0 / 0
17.01.2015, 13:48
    #38856702
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Это классика брат. Как раз для самых неизменяемых констант.
...
Рейтинг: 0 / 0
17.01.2015, 19:12
    #38856838
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
JackARoeMasterZiv,
ага, осознал уже. и вам спасибо.
а вот глубину комментария mayton'а не осознал - это типа если мне нужно такое ничем неизменяемое значение, то определять его дефайном?

в общем это шутка такая.
...
Рейтинг: 0 / 0
17.01.2015, 20:32
    #38856859
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
maytonЭто классика брат. Как раз для самых неизменяемых констант.С появлением ключевого слова const использовать директиву препроцессора define нужно осмысленно, а не потому, что "классика".
...
Рейтинг: 0 / 0
18.01.2015, 02:47
    #38856940
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
MasterZivв общем это шутка такая.
Не, mayton просто заразился от самизнаетекого
...
Рейтинг: 0 / 0
18.01.2015, 12:14
    #38856983
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Это диалектический спор на тему что было первым - курца или яйцо является константой.
...
Рейтинг: 0 / 0
18.01.2015, 13:24
    #38856997
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Обычно то, что засунуто в define, считается литералом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.01.2015, 14:15
    #38857012
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
общедоступная интернет-энциклопедия Литерал (англ. literal — константа) — запись в исходном коде компьютерной программы,
представляющая собой фиксированное значение. Литералами также называют
представление значения некоторого типа данных
...
Рейтинг: 0 / 0
18.01.2015, 15:47
    #38857040
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Доброго времени суток.

Dima Tconst обычно используют для передачи указателей в параметрах, это указывает на то что вызываемая функция не
изменит значения по указателю. Ну и компилятор контролирует чтобы это не произошло.


каким образом компилятор это контролирует ? Неужели перед каждой операцией присваивания, проверяет характеристики объекта по которому происходит попытка записи ?
...
Рейтинг: 0 / 0
18.01.2015, 15:50
    #38857045
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
SashaMercuryкаким образом компилятор это контролирует ?При компиляции исходного текста.
При большом желании - может упихнуть всё константное на страницы "только для чтения".
...
Рейтинг: 0 / 0
18.01.2015, 15:54
    #38857048
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Да, это происходит во время компиляции, но как именно ? Или в каждом компиляторе по своему ?
И у меня есть такое чувство, что раньше ошибки такого рода отлавливались во время выполнения. Так ли это ?
...
Рейтинг: 0 / 0
18.01.2015, 16:34
    #38857059
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
SashaMercuryДа, это происходит во время компиляции, но как именно ?Ну, например, константное значение не может оказаться слева от оператора присваивания или быть передано аргументом, если у прототипа функции нет модификатора const для этого аргумента. Всё это не требует поддержки времени выполнения.
...
Рейтинг: 0 / 0
19.01.2015, 06:15
    #38857164
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
Basil A. Sidorov,
смутно понял. Спасибо :)
...
Рейтинг: 0 / 0
19.01.2015, 22:23
    #38857919
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
SashaMercuryДа, это происходит во время компиляции, но как именно ? Или в каждом компиляторе по своему ?

Ну, в теории это одинаково во всех компиляторах: грамматика языка известна, строятся AST и если не получается составить корректное выражение - например, константное значение слева от оператора присваивания - то, фьюить, ошибка компиляции.
Как оно на практике реализовано в каждом компиляторе, знают только их разработчики.
...
Рейтинг: 0 / 0
19.01.2015, 22:25
    #38857920
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на константу
SashaMercury,

и вообще, Драконья книга в помощь.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на константу / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]