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

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

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

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

12.07.2012, 21:44. Просмотров 4050. Ответов 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?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.07.2012, 21:51     const_cast что это? #2
http://codepad.org/tiOYR1o1

мне так больше нравится
это снятие константности, невалидное в данном случае
Vort_
 Аватар для 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
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.07.2012, 21:56     const_cast что это? #5
а так да
изза оптимизации компилятор считает, что константа не меняется
но не тут то было

Добавлено через 1 минуту
Цитата Сообщение от Nick Alte Посмотреть сообщение
То, что на экран выводится её предыдущее значение - результат некорректной работы оптимизатора, который ошибочно предположил, что объявленная как const переменная a изменяться не будет и подставил инициализационное значение.
здесь нет некорректной работы
после того, как программист снял константность с константы и начал в нее писать имеем undefined behavior
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
12.07.2012, 21:57  [ТС]     const_cast что это? #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
это снятие константности, невалидное в данном случае
А для чего это вообще нужно?
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17189 / 5443 / 337
Регистрация: 30.03.2009
Сообщений: 14,777
Записей в блоге: 26
12.07.2012, 21:59     const_cast что это? #7
Цитата Сообщение от yleart Посмотреть сообщение
Так что делает const_cast?
Для полноты картины: http://alenacpp.blogspot.com/2005/08/c.html
kent
Нуб со стажем
 Аватар для kent
36 / 34 / 2
Регистрация: 19.02.2012
Сообщений: 118
12.07.2012, 21:59     const_cast что это? #8
Цитата Сообщение от yleart Посмотреть сообщение
А для чего это вообще нужно?
чтобы изменить значение константы
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17189 / 5443 / 337
Регистрация: 30.03.2009
Сообщений: 14,777
Записей в блоге: 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++
C++ Const_cast ub
C++ Const_cast и mutable
C++ Объясните, что происходит при использовании const_cast
C++ Const_cast может добавлять константность?

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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 что это?
Ответ Создать тему
Опции темы

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