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

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

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

const_cast - C++

01.06.2011, 09:06. Просмотров 2318. Ответов 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). Где эта девятка собственно хранится?

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

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

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

Не понятно с const_cast - C++
Адрес один и тот же, а значения разные, как так? #include &lt;iostream&gt; int main() { const double pi = 3.14159265; ...

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

Const_cast и mutable - C++
В чем их отличие и когда их необходимо использовать (если не нарушена архитектура программы)?

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

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

Добавлено через 15 минут
Проверил на MSVS 2008 в дизасемблированном коде прописана 8.
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
01.06.2011, 09:57 #3
const есть const.
0
NоName
3 / 3 / 0
Регистрация: 31.05.2011
Сообщений: 10
01.06.2011, 10:56 #4
Хотите увидеть 9 -
volatile const int x = 8;
0
dihlofos
Бродяга
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
01.06.2011, 18:33  [ТС] #5
CyBOSSeR, точно, спасибо большое, теперь понял. Т.е. какое значение использовать вместо константы, в данном случае решится уже на этапе компиляции (интересно, а так сделает каждый компилятор?)
Меня просто сбило то, что раз в программе используется операция получения адреса константы и присваивания его указателю, то логично наверное выделить под неё память (ведь так?). А потом, как я подумал, при всех использованиях константы, будет извлекаться её значение из памяти (раз уж память выделена). Но как оказалось, в этом то я и ошибся.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.06.2011, 18:44 #6
Цитата Сообщение от NоName Посмотреть сообщение
Хотите увидеть 9 -
volatile const int x = 8;
Почитай, там под катом.
0
NоName
3 / 3 / 0
Регистрация: 31.05.2011
Сообщений: 10
01.06.2011, 20:37 #7

Не по теме:

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


А по теме все правильно - с volatile "std::cout << "x = " << x << '\n';" на 18 строке напечатает 9
"(std::cout << "&x = " << &x << '\n'; // выводит 8" на 20 строке, естественно, никакую 8 не выводит, что с volatile, что без. Это dihlofos промахнулся )
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2011, 20:37
Привет! Вот еще темы с ответами:

Особенности использования 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++
Здравствуйте! В общем, наткнулся на такую программу: #include &lt;iostream&gt; int main(int argc, char *argv) { std::cout &lt;&lt; &quot;Hello!&quot;...

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() { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.06.2011, 20:37
Ответ Создать тему
Опции темы

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