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

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

Войти
Регистрация
Восстановить пароль
 
MarVaL
С++ Beginner
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
#1

Не понятно с const_cast - C++

14.09.2013, 20:29. Просмотров 536. Ответов 10
Метки нет (Все метки)

Адрес один и тот же, а значения разные, как так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
 
int main()
{
    const double pi = 3.14159265;
    double* ip;
    ip = const_cast<double*>(&pi);
    std::cout << ip << " " << *ip << std::endl;
    std::cout << &pi << " " << pi << std::endl;
    *ip = 0;
    std::cout << ip << " " << *ip << std::endl;
    std::cout << &pi << " " << pi << std::endl;
    return 0;
}
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 20:29     Не понятно с const_cast
Посмотрите здесь:

как i двигается понятно но вот не понятно как это делает j ? - C++
Здравствуйте, вопрос очень глупы но все же есть цикл for (int i = 0,j = 0; i &lt; source.length; i++) как i двигается понятно но вот не...

const_cast - C++
День добрый. Пытаюсь вот разобраться как работает данный оператор. Имеется пример: #include &lt;iostream&gt; int main() { const...

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 и mutable - C++
В чем их отличие и когда их необходимо использовать (если не нарушена архитектура программы)?

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
14.09.2013, 20:41     Не понятно с const_cast #2
Ну вы взяли и перезаписали константную переменную pi через неконстантный указатель (вообще-то, это - неопределенное поведение, ub). Естественно, что после *ip = 0 у нее другое значение.
MarVaL
С++ Beginner
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
14.09.2013, 20:42  [ТС]     Не понятно с const_cast #3
Цитата Сообщение от zenw Посмотреть сообщение
Ну вы взяли и перезаписали константную переменную pi через неконстантный указатель (вообще-то, это - неопределенное поведение, ub). Естественно, что после *ip = 0 у нее другое значение.
Так значит, что лежит по тому адресу? По правде
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
14.09.2013, 20:49     Не понятно с const_cast #4
Цитата Сообщение от MarVaL Посмотреть сообщение
Так значит, что лежит по тому адресу? По правде
До момента выполнения строки с *ip = 0 - 3,1415..., после этого момента - 0.
MarVaL
С++ Beginner
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
14.09.2013, 20:50  [ТС]     Не понятно с const_cast #5
Цитата Сообщение от zenw Посмотреть сообщение
До момента выполнения строки с *ip = 0 - 3,1415..., после этого момента - 0.
А когда я вывожу константу , он её идентификатор просто связывает с 3.141...?
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,262
Завершенные тесты: 1
14.09.2013, 20:59     Не понятно с const_cast #6
MarVaL, нельзя изменять константный объект.

Вот выдержки из стандарта (С++03):
5.2.11

7. [Note:Depending on the type of the object, a write operation through
the pointer, lvalue or pointer to data member resulting from a const_cast
that casts away a const-qualifier may produce undefined behavior (7.1.5.1).]



7.1.5.1

4. Except that any class member declared mutable(7.1.1) can be modified,
any attempt to modify aconst object during its lifetime (3.8) results
in undefined behavior.
11-ая строка (*ip = 0) - это неопределенное поведение.
Программа с таким же успехом могла бы показать, что по адресу
лежит 0, или 42, или еще что-нибудь. Или вылететь с ошибкой.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,424
14.09.2013, 22:07     Не понятно с const_cast #7
А сейчас я расскажу по правде что и как происходит.

Коль скоро работаешь с адресами, настоятельно рекомендую использовать printf, ибо при непонятках можно залезть в отладчик и посмотреть- тот ли адрес на самом деле подаётся printf и что по нему лежит. cout же в отладчике не найти.

В комментах написано то, что делает процессор и чего мы не видим

C++
1
2
3
4
5
6
7
8
9
10
11
    printf ("%x  %f\n", ip , *ip);
    printf ("%x  %f\n", &pi, pi);
    
    //В этом месте выделяется ячейка x памяти, куда записывается значение pi
    *ip = 0;
 
    printf ("%x  %f\n", ip , *ip);
    
    //А в этом месте значение из ячейки памяти x вновь записывается по ip
    //Ничего этого мы, естественно не видим.
    printf ("%x  %f\n", &pi, pi);
...Всё это написано мной по памяти, ибо однажды была подобная тема, но её не найти. Сейчас полезу в отладчик смотреть, так ли это. Если ошибаюсь- отпишусь.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,424
14.09.2013, 22:25     Не понятно с const_cast #8
Я ошибся. Дело происходит так:

C++
1
2
3
4
5
6
7
8
9
10
11
    printf ("%x  %f\n", ip , *ip);
    printf ("%x  %f\n", &pi, pi);
    *ip = 0;
    printf ("%x  %f\n", ip , *ip);
 
    //А в этом месте по ip вновь кладётся значение ip
    //НА рисунке это две инструкции:
    //MOV EAX,53C8D4F1
    //...
    //MOV DWORD PTR SS:[ESP+8],EAX          
    printf ("%x  %f\n", &pi, pi);
Миниатюры
Не понятно с const_cast  
ValeryS
14.09.2013, 22:31
  #9

Не по теме:

kravam,
А что у тебя за компилятор?
никогда не видел чтобы параметры так в стек запихивались?

Цитата Сообщение от kravam Посмотреть сообщение
//MOV DWORD PTR SS:[ESP+8],EAX

kravam
14.09.2013, 22:38
  #10

Не по теме:

Не, ну почему же, если ESP указывает на вершину стека (а оно так и есть), то как раз всё так и получается, ESP+8- наше значение (pi), ESP+4 и ESP- строки формата. Так вот они захотели, нетрадиционно положить. Сперва инициализировали ESP конечным значением, а потом заполнили стек, gcc 4.6.2

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2013, 22:42     Не понятно с const_cast
Еще ссылки по теме:

const_cast что это? - C++
Здравствуйте! В общем, наткнулся на такую программу: #include &lt;iostream&gt; int main(int argc, char *argv) { std::cout &lt;&lt; &quot;Hello!&quot;...

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

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

const_cast для чего и как функционирует - C++
Дошел в свой книге (Дейтел) до const_cast, не могу понять смысла, т.к. там нагромождено не нужно кода в примере, в 5 раза больше самого...


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

Или воспользуйтесь поиском по форуму:
ValeryS
14.09.2013, 22:42     Не понятно с const_cast
  #11

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
Не, ну почему же, если ESP указывает на вершину стека (а оно так и есть), то как раз всё так и получается, ESP+8- значение, ESP+4 и ESP- строки формата. Так вот они захотели, нетрадиционно положить.
не ну это то понятно
но обычно PUSH и никаких гвоздей, такое видел когда структуры передают
Цитата Сообщение от kravam Посмотреть сообщение
gcc 4.6.2
будем знать его визитную карточку

Yandex
Объявления
14.09.2013, 22:42     Не понятно с const_cast
Ответ Создать тему
Опции темы

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