Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
#1

const_cast - C++

01.06.2011, 09:06. Просмотров 2311. Ответов 6
Метки нет (Все метки)

День добрый. Пытаюсь вот разобраться как работает данный оператор. Имеется пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
int main()
{
    const int x = 8;
    
    int * ptr = const_cast<int*>(&x);
    
    std::cout << "Before changing: \n";
    std::cout << "x = " << x << '\n';
    std::cout << "*ptr = " << *ptr << '\n';
    std::cout << "&x = " << &x << '\n';
    std::cout << "ptr = " << ptr << '\n';
    
    *ptr = 9;
    
    std::cout << "\nAfter changing: \n";
    std::cout << "x = " << x << '\n';
    std::cout << "*ptr = " << *ptr << '\n'; // выводит 9
    std::cout << "&x = " << &x << '\n'; // выводит 8
    std::cout << "ptr = " << ptr << '\n';
    
    return 0;
}
После присваивания *ptr = 9, указатель продолжает указывать на x, но почему тогда при выводе *ptr и x получаются разные значения. Т.е. const x каким был таким и остался (8, и это вроде логично), но указатель на него при разыменовании даёт другое число (9). Где эта девятка собственно хранится?

Буду благодарен советам и подсказкам))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2011, 09:06     const_cast
Посмотрите здесь:

const_cast(*this) - C++
Пусть есть некий class Foo { ... }; std::wostream&amp; operator&lt;&lt; (std::wostream &amp;out, Foo &amp;obj) { // ... very-very many...

const_cast mutable - C++
в чем разница? спасибо.

const_cast: const и volatile - C++
Как известно const_cast сбрасывает наложенные ограничения при помощи модификаторов const и volatile. Как мне стало известно volatile -...

Особенности использования const_cast - C++
Почему не работает код: 1. const int* const pInt = new int(0); const_cast&lt;int*&gt;(pInt) = new int(4); 2. void...

Const_cast может добавлять константность? - C++
Недавно мне задали вопрос, что может делать const_cast, я с серьёзным лицом ответил, что может удалять/добавлять константность указателям(и...

Const_cast - правильно ли я его использую? - C++
Доброго времени суток! #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;typeinfo&gt; using namespace std; int main() { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.06.2011, 09:25     const_cast #2
dihlofos, я подозреваю что в данной строке
C++
1
std::cout << "x = " << x << '\n';
вместо x компилятор просто подставит восьмерку. Посмотрите дизасемблированный код.

Добавлено через 15 минут
Проверил на MSVS 2008 в дизасемблированном коде прописана 8.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.06.2011, 09:57     const_cast #3
const есть const.
NоName
3 / 3 / 0
Регистрация: 31.05.2011
Сообщений: 10
01.06.2011, 10:56     const_cast #4
Хотите увидеть 9 -
volatile const int x = 8;
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
01.06.2011, 18:33  [ТС]     const_cast #5
CyBOSSeR, точно, спасибо большое, теперь понял. Т.е. какое значение использовать вместо константы, в данном случае решится уже на этапе компиляции (интересно, а так сделает каждый компилятор?)
Меня просто сбило то, что раз в программе используется операция получения адреса константы и присваивания его указателю, то логично наверное выделить под неё память (ведь так?). А потом, как я подумал, при всех использованиях константы, будет извлекаться её значение из памяти (раз уж память выделена). Но как оказалось, в этом то я и ошибся.
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
01.06.2011, 18:44     const_cast #6
Цитата Сообщение от NоName Посмотреть сообщение
Хотите увидеть 9 -
volatile const int x = 8;
Почитай, там под катом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2011, 20:37     const_cast
Еще ссылки по теме:

Изменение константного объекта с применением const_cast - C++
1. Это код из учебника С. Прата &quot;Лекции и упражнения&quot;. #include &lt;iostream&gt; using namespace std; void change(const int* pt,...

Объясните, что происходит при использовании const_cast - C++
#include &lt;iostream&gt; using namespace std; void sqr(int&amp; a) { a = a*a; } int main() { const int b = 5;

Использование const_cast - C++ Qt
За это руки надо отрубать. :D Я тоже, когда начинал программировать использовал подобные хаки. Только потом понял какое на самом деле они...

Const_cast ub - C++
в каком-то видео для новичков увидел классный код такого плана const int x = 42; const_cast&lt;int&amp;&gt;(x) = 666; ведет ли такой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NоName
3 / 3 / 0
Регистрация: 31.05.2011
Сообщений: 10
01.06.2011, 20:37     const_cast #7

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Почитай, там под катом.
Собственно, да, именно это я там хотел добавить - приводится к bool вместо bool*


А по теме все правильно - с volatile "std::cout << "x = " << x << '\n';" на 18 строке напечатает 9
"(std::cout << "&x = " << &x << '\n'; // выводит 8" на 20 строке, естественно, никакую 8 не выводит, что с volatile, что без. Это dihlofos промахнулся )
Yandex
Объявления
01.06.2011, 20:37     const_cast
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru