![]() |
|
Модераторы: 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 |
зачем вы гадаете? ссылку-то я на что дал? |
|||
|
||||
| LeonidPr |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Заинтересовала эта тема (особенно в плане проделок компилятора), решил попробовать запустить этот пример с вашими исправлениями. И столкнулся с интересной особенностью компиляторов. После сборки и запуска примера в C++ Builder 5 получил вывод в консоли: 3 3 2 (т.е. в качестве значения b выводится то, что ей присвоили). Компиляция этого примера компилером gcc дала результат: 3 3 3. Возможно необходимо ковырять настройки Builder-а, но оптимизацию я полностью отключил. Решил посмотреть, что-же генерит Builder. Скормил exe-шник ida и получил следующее (комментарии мои):
Получается, как было уже сказано mes, "не изменяется" и "выводится старое значение" это разное поведение. Компилятор при выводе константы запихнул в стек не то значение, которое расположено в памяти, выделенной для этой константы, а то значение, которым её инициализировали при объявлении. Это сообщение отредактировал(а) LeonidPr - 17.2.2012, 09:37 --------------------
pkunzip.zip |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
гадание это ко мне относится ? ну так я не знаю же результатов именно тс, даже если по ссылке показывает эту ошибку |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
newbee бдит!
|
|||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Да, уж, теперь я точно понял, что совершенно ничего не понял.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
novice2011, а что тут понимать? Язык С++ очень мощный. На нем можно и легкое быстрое приложение состряпать для встраиваемого девайса, а можно и распределенную систему промышленного уровня написать за вменяемые сроки. Но за все надо платить: язык содержит в себе ряд спорных особенностей (иногда даже ошибок проектирования самого языка), которые при неправильном использовании могут сильно усложнить жизнь. Поэтому, чтобы все эти особенности освоить, нужно огромное время изучения и практики.
Если ты чувствуешь в себе силы всю жизнь учиться, а так же желание писать программы, то добро пожаловать к нам - С/С++ программистам. Если же тебе хочется только попробовать, то можешь начать с что-нибудь попроще. |
|||
|
||||
| novice2011 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Спасибо, bsa. Хочется стать таким же грамотным, как ребята, которые помогли мне уяснить некоторые моменты, поэтому остается только утроить свои усилия по изучению языка.
|
|||
|
||||
![]()
|
| Правила форума "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. |