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

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

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

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

14.09.2013, 20:29. Просмотров 529. Ответов 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;
}
Изображения
 
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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...?
Убежденный
Системный программист
Эксперт С++
14915 / 6733 / 1059
Регистрация: 02.05.2013
Сообщений: 11,017
Завершенные тесты: 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
быдлокодер
1696 / 875 / 44
Регистрация: 04.06.2008
Сообщений: 5,345
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
быдлокодер
1696 / 875 / 44
Регистрация: 04.06.2008
Сообщений: 5,345
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++
Особенности использования const_cast C++
C++ Const_cast ub
C++ Const_cast и mutable
C++ Const_cast может добавлять константность?

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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