Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
MarVaL
С++ Beginner
118 / 118 / 77
Регистрация: 28.02.2013
Сообщений: 246
1

Не понятно с const_cast

14.09.2013, 20:29. Просмотров 590. Ответов 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;
}
0
Изображения
 
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 20:29
Ответы с готовыми решениями:

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

Const_cast
Всем доброе утро! Ребят, объясните мне, глупой, почему мы можем изменять...

const_cast(*this)
Пусть есть некий class Foo { ... }; std::wostream&amp; operator&lt;&lt;...

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

Const_cast ub
в каком-то видео для новичков увидел классный код такого плана const int x...

10
zenw
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
14.09.2013, 20:41 2
Ну вы взяли и перезаписали константную переменную pi через неконстантный указатель (вообще-то, это - неопределенное поведение, ub). Естественно, что после *ip = 0 у нее другое значение.
1
MarVaL
С++ Beginner
118 / 118 / 77
Регистрация: 28.02.2013
Сообщений: 246
14.09.2013, 20:42  [ТС] 3
Цитата Сообщение от zenw Посмотреть сообщение
Ну вы взяли и перезаписали константную переменную pi через неконстантный указатель (вообще-то, это - неопределенное поведение, ub). Естественно, что после *ip = 0 у нее другое значение.
Так значит, что лежит по тому адресу? По правде
0
zenw
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
14.09.2013, 20:49 4
Цитата Сообщение от MarVaL Посмотреть сообщение
Так значит, что лежит по тому адресу? По правде
До момента выполнения строки с *ip = 0 - 3,1415..., после этого момента - 0.
1
MarVaL
С++ Beginner
118 / 118 / 77
Регистрация: 28.02.2013
Сообщений: 246
14.09.2013, 20:50  [ТС] 5
Цитата Сообщение от zenw Посмотреть сообщение
До момента выполнения строки с *ip = 0 - 3,1415..., после этого момента - 0.
А когда я вывожу константу , он её идентификатор просто связывает с 3.141...?
0
Убежденный
Ушел с форума
Эксперт С++
15999 / 7270 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
14.09.2013, 20:59 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, или еще что-нибудь. Или вылететь с ошибкой.
2
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
14.09.2013, 22:07 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);
...Всё это написано мной по памяти, ибо однажды была подобная тема, но её не найти. Сейчас полезу в отладчик смотреть, так ли это. Если ошибаюсь- отпишусь.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
14.09.2013, 22:25 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);
0
Миниатюры
Не понятно с const_cast  
ValeryS
14.09.2013, 22:31
  #9

Не по теме:

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

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

0
kravam
14.09.2013, 22:38
  #10

Не по теме:

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

1
ValeryS
14.09.2013, 22:42     Не понятно с const_cast
  #11

Не по теме:

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

0
14.09.2013, 22:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2013, 22:42
Привет! Вот еще темы с ответами:

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

Const_cast и mutable
В чем их отличие и когда их необходимо использовать (если не нарушена...

const_cast что это?
Здравствуйте! В общем, наткнулся на такую программу: #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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