Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

12.07.2012, 21:44. Просмотров 4578. Ответов 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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2012, 21:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос const_cast что это? (C++):

Объясните, что происходит при использовании const_cast - C++
#include &lt;iostream&gt; using namespace std; void sqr(int&amp; a) { a = a*a; } int main() { const int b = 5;

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

Const_cast ub - C++
в каком-то видео для новичков увидел классный код такого плана const int x = 42; const_cast&lt;int&amp;&gt;(x) = 666; ведет ли такой...

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

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 double pi = 3.14159265; ...

9
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 21:51 #2
http://codepad.org/tiOYR1o1

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

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

Добавлено через 1 минуту
Цитата Сообщение от Nick Alte Посмотреть сообщение
То, что на экран выводится её предыдущее значение - результат некорректной работы оптимизатора, который ошибочно предположил, что объявленная как const переменная a изменяться не будет и подставил инициализационное значение.
здесь нет некорректной работы
после того, как программист снял константность с константы и начал в нее писать имеем undefined behavior
1
yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
12.07.2012, 21:57  [ТС] #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
это снятие константности, невалидное в данном случае
А для чего это вообще нужно?
0
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
12.07.2012, 21:59 #7
Цитата Сообщение от yleart Посмотреть сообщение
Так что делает const_cast?
Для полноты картины: http://alenacpp.blogspot.com/2005/08/c.html
1
kent
Нуб со стажем
36 / 34 / 2
Регистрация: 19.02.2012
Сообщений: 118
12.07.2012, 21:59 #8
Цитата Сообщение от yleart Посмотреть сообщение
А для чего это вообще нужно?
чтобы изменить значение константы
1
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
12.07.2012, 22:00 #9
Цитата Сообщение от yleart Посмотреть сообщение
А для чего это вообще нужно?
Ты же можешь разделить на ноль, хотя этого нельзя делать. И тебя никто спрашивать не будет, а зачем это нужно. В твоём примере ситуация такая же
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 22:13 #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() {
 
}
0
12.07.2012, 22:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 22:13
Привет! Вот еще темы с ответами:

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...

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


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

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

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