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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.94
yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
#1

const_cast что это? - C++

12.07.2012, 21:44. Просмотров 4276. Ответов 9
Метки нет (Все метки)

Здравствуйте! В общем, наткнулся на такую программу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main(int argc, char *argv[])
{
    std::cout << "Hello!" << std::endl;
    const int a = 5;
    int *b;
    b = const_cast<int *>(&a);
    *b = 4;
    std::cout << &a << " " << b << std::endl;
    std::cout << a << " " << *b << std::endl;
}
Вывод такой:
C++
1
2
3
Hello!                                                                                                                                     
0xbf971ddc 0xbf971ddc                                                                                                                      
5 4
Похоже, что a и b имеют один и тот же адрес, но разные значения..
Очевидно, что все изюминка в 8 строчке... Так что делает const_cast?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2012, 21:44     const_cast что это?
Посмотрите здесь:

Объясните, что происходит при использовании 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 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...

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 21:51     const_cast что это? #2
http://codepad.org/tiOYR1o1

мне так больше нравится
это снятие константности, невалидное в данном случае
Vort_
186 / 186 / 52
Регистрация: 10.07.2012
Сообщений: 400
12.07.2012, 21:52     const_cast что это? #3
похоже что тут дело в оптимизациях компилятора
вот такая модификация уже приведёт к ожидаемым значениям:

C++
1
2
3
int readA() {return 5;}
...
const int a = readA();
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
12.07.2012, 21:54     const_cast что это? #4
const_cast снимает константность при преобразовании типа. Поскольку переменная a была изначально константной, её адрес имел тип const int *. Благодаря const_cast с типа адреса была снята константность и его стало возможно поместить в переменную b, которая указывает на неконстантное целое число. Так что в 9 строчке изменяется значение переменной a. То, что на экран выводится её предыдущее значение - результат некорректной работы оптимизатора, который ошибочно предположил, что объявленная как const переменная a изменяться не будет и подставил инициализационное значение. Если добавить к объявлению переменной a ещё и ключевое слово volatile, то такие оптимизации для этой переменной будут отключены и на экран выведутся две четвёрки.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 21:56     const_cast что это? #5
а так да
изза оптимизации компилятор считает, что константа не меняется
но не тут то было

Добавлено через 1 минуту
Цитата Сообщение от Nick Alte Посмотреть сообщение
То, что на экран выводится её предыдущее значение - результат некорректной работы оптимизатора, который ошибочно предположил, что объявленная как const переменная a изменяться не будет и подставил инициализационное значение.
здесь нет некорректной работы
после того, как программист снял константность с константы и начал в нее писать имеем undefined behavior
yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
12.07.2012, 21:57  [ТС]     const_cast что это? #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
это снятие константности, невалидное в данном случае
А для чего это вообще нужно?
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
12.07.2012, 21:59     const_cast что это? #7
Цитата Сообщение от yleart Посмотреть сообщение
Так что делает const_cast?
Для полноты картины: http://alenacpp.blogspot.com/2005/08/c.html
kent
Нуб со стажем
36 / 34 / 2
Регистрация: 19.02.2012
Сообщений: 118
12.07.2012, 21:59     const_cast что это? #8
Цитата Сообщение от yleart Посмотреть сообщение
А для чего это вообще нужно?
чтобы изменить значение константы
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
12.07.2012, 22:00     const_cast что это? #9
Цитата Сообщение от yleart Посмотреть сообщение
А для чего это вообще нужно?
Ты же можешь разделить на ноль, хотя этого нельзя делать. И тебя никто спрашивать не будет, а зачем это нужно. В твоём примере ситуация такая же
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 22:13     const_cast что это?
Еще ссылки по теме:

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

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++
1. Это код из учебника С. Прата &quot;Лекции и упражнения&quot;. #include &lt;iostream&gt; using namespace std; void change(const int* pt,...


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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 22:13     const_cast что это? #10
Цитата Сообщение от kent Посмотреть сообщение
чтобы изменить значение константы
нет
чтобы работать с неконстантами в константном контексте

я встречал использование такого в основном при неудачном унаследованном интерфейсе

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
25
26
27
class A {
public:
  virtual void handle() const {}
};
 
class B : public A {
public:
  virtual void handle() const {
    B* b_ptr = const_cast<B*>(this);
    b_ptr->a = 10;
  }
private:
  int a;
};
 
class C : public A {
public:
  virtual void handle() const {
    a = 10;
  }
private:
  mutable int a;
};
 
int main() {
 
}
Yandex
Объявления
12.07.2012, 22:13     const_cast что это?
Ответ Создать тему
Опции темы

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