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

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

Войти
Регистрация
Восстановить пароль
 
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

const_cast для чего и как функционирует - C++

30.08.2013, 20:46. Просмотров 886. Ответов 5
Метки нет (Все метки)

Дошел в свой книге (Дейтел) до const_cast, не могу понять смысла, т.к. там нагромождено не нужно кода в примере, в 5 раза больше самого примера, вот я сделал свой пример:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
const int var = 10;
 
int *ptr = const_cast<int *>(&var);
 
cout << "*ptr: " << *ptr << " ptr: " << ptr << endl; // 10
cout << "var: " << var << " &var: " << &var << endl; // 10
 
*ptr = 15;
 
cout << "*ptr: " << *ptr << " ptr: " << ptr << endl; // 15
cout << "var: " << var << " &var: " << &var << endl; // 10


var и ptr указывают на одно и тоже значение т.е. имеют один и тот же адрес в памяти, при этом, если обратится к var то оно будет равно 10, а если к *ptr то оно будет равно 15, как так?

Вообще техническая реализация меня не интересует, вопрос, работает ли оно верно? и как я понимаю смысл в этом то и заключается, если вдруг мне надо изменить константное значение при этом что бы оно не менялось (бред по большому счету), то я делаю указатель, использую const_cast и могу указатель меня сколько влезет, а вот само константное значение остается прежним? правильно? или у const_cast более мудреные цели?
И вообще зачем это нужно, ведь проще объявить временную переменную и присвоить ей значение константы и уже крутить эту временную переменную, в чем смысл?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2013, 20:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос const_cast для чего и как функционирует (C++):

Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все обьявлять. - C++
Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все...

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

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

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

5
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
30.08.2013, 20:58 #2
Цитата Сообщение от VLK Посмотреть сообщение
Вообще техническая реализация меня не интересует, вопрос, работает ли оно верно?
Работает верно, т.к. 8 строка - попытка изменить значение константы - это UB.

Добавлено через 9 минут
Т.е. с помощью const_cast можно "снять с типа" const\volatile, но тип аргумента от этого никак не измениться.
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
30.08.2013, 21:03  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Т.е. с помощью const_cast можно "снять с типа" const\volatile, но тип аргумента от этого никак не измениться.
что то я не совсем понимаю, когда есть слово const, это значит что значение изменять нельзя, тут вроде как я const снимаю с помощью const_cast, но при этом все равно не могу менять значение, в чем смысл?

Добавлено через 1 минуту
Для каких целей, а точнее с каком случае применяется const_cast тогда?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
30.08.2013, 21:15 #4
Цитата Сообщение от VLK Посмотреть сообщение
что то я не совсем понимаю, когда есть слово const, это значит что значение изменять нельзя, тут вроде как я const снимаю, но при этом все равно не могу менять значение, в чем смысл?
Ну я знаю один случай, когда смысл есть: когда есть несостыковки в типизации; например (утрированный пример), тебе надо использовать "левую" ф-ю, которая принимает аргументом char *:
C++
1
size_t count_vowels(char * str);
Ты в принципе знаешь, что строку она не меняет, просто её автор решил, что "const ненужно". Поэтому тебе надо просто получить переменную без const в типе, что бы "обойти" статическую типизацию:
C++
1
2
char const* str = "...";
count_vowels(const_cast<char *>(str));
Из за const_cast str не перестанет быть указателем на константу, и изменять то, на что он указывает (и, соответственно, то, на что указывает результат const_cast), черевато; ты просто как бы говоришь компилятору: "я знаю, что я делаю, не мешай".
2
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.08.2013, 21:50 #5
const_cast это средство лечения от кривых библиотек (const-incorrect, выражаясь более толерантно). То есть данные могут не изменяться, но const просто не указан. Абстрактный пример в вакууме:
C++
1
2
3
4
5
6
void log(char *msg) { printf("%s: %s\n", __LINE__, msg); }
 
int main() {
    char[] m = "message";
    log(const_cast<char *>(m);
}
Важно отличать, варианты корректного применения и варианты, приводящие к UB.
C++
1
2
3
int i = 10;
const int *ptr = &i;
*(const_cast<int *>(ptr)) = 11;
ptr константен, но указывает на int, который константным не является, следовательно данный случай корректен. Если же применить const_cast к указателю, который указывает на на самом деле константные данные, то уже UB:
C++
1
2
3
const int i = 10;
const int *ptr = &i;
*(const_cast<int *>(ptr)) = 11;
1
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
30.08.2013, 22:10 #6
Цитата Сообщение от fasked Посмотреть сообщение
char[] m
Java forever?
1
30.08.2013, 22:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2013, 22:10
Привет! Вот еще темы с ответами:

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

const_cast что это? - C++
Здравствуйте! В общем, наткнулся на такую программу: #include &lt;iostream&gt; int main(int argc, char *argv) { std::cout &lt;&lt; &quot;Hello!&quot;...

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

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


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

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

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