![]() |
|
Модераторы: bsa |
![]()
|
|
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Переменная b объявлена с идентификатором const, поэтому операция const_cast не может изменить ее значение. Объект bar так же объявлен с идентификатором const, однако операция const_cast меняет его значение. Вопрос, почему? По идее, не должна. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
не по этому. у тебя ошибка в коде. найди десять отличий ;) : http://liveworkspace.org/code/2a4c89cc868d...04b0059b7543f6e Добавлено через 1 минуту и 20 секунд и если бы он не мог - ты бы получил ошибку компиляции. Добавлено через 1 минуту и 46 секунд с ссылками все по взрослому |
|||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Уважаемый, boostcoder, ввиду своей неопытности я не понял, а где именно ошибка в коде? Не смогли бы вы пояснить? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
одна тут : int& c =... |
|||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Да, вы правы, но после исправления этой ошибки все остается по-прежнему. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
все ли ? с этой ошибкой не происходило изменения значения, а сейчас происходит, даже если вывод этого не показывает вообщем если у вас выводится старое значение, то это не чудеса вот это поможет поправить вывод :
|
|||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Да, но в этом коде дело даже не в переменной с. Просматривая литературу, я прочитал: "Операция const_cast не во всем хороша. Она может изменить указатель на величину, но эффект от изменения значения, заданного как const, не определен". В этом же коде объект bar объявляется как const, но тем не менее, с помощью операции const_cast его можно изменить, что противоречит выше приведенной цитате из книги Стивена Прата. Вот этого я и не пойму.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Понял, всем большое спасибо!
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
novice2011, для полноты понимания, нужно учитывать что бывает три вида констант:
1. реальныя константа рантайма, находящаяся в read-only памяти - менять такую никогда нельзя например char *str = "hello"; из за совместимости можно присвоить реальный константный объект неконстантной переменной, но изменение ее чревато исключением.. 2. логическая константа - обычная переменная помеченная квалификатором const - такие менять с помощью const_cast относительно безопасно, за исключением проявления шуток оптимизатора, как у вас в примере.. 3. константное выражение - это константа времени компиляции и не неаходится в памяти.. так например выражение const int size = 4; создает одну константную переменную,которую можно изменить и ассоциированное с ним константное выражение, которое можно применять например при создании массивов int arr[size]; при этом размер массива будет равен первоначальному значению, даже если вы до этого изменили size через конст_каст.. |
|||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Да, поясню, что вопросы у меня возникли после этого примера:
Вывод программы: pop1, pop2: 38383, 2000 pop1, pop2: 100, 2000 Т.е здесь pop2 не изменяется, поэтому я и попробовал применить const к объекту класса. Но объект класса в результате поменял свое значение, в отличие от pop2 в этом примере. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
опять та же ошибка в понимании.. "не изменяется" и "выводится старое значение" это разное поведение можно вот так заставить компилятор выводить актуальное значение константы :
Это сообщение отредактировал(а) mes - 16.2.2012, 13:25 |
|||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Спасибо, mes.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
зачем вы гадаете? ссылку-то я на что дал? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |