crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Когда применять const_cast
AXELman4ever
  опции профиля:
сообщение 24.9.2011, 2:20
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем добрый!

Пытаюсь понять принцип работы const_cast. Для интереса про-инициализировал значение (int) переменной в стеке, вместо того, чтобы создать на него указатель. После чего, загнал ссылку переменной и решил привести к типу pointer на int, дабы снять с переменной константность:

const int i = 5;
int *ptr = const_cast <int*> (&i);


после чего решил инкрементировать значение по указателю и проверить, изменилось ли значение константной переменной.
Для уверенности и сравнения обеих значений вызвал адрес на который ссылается указатель, и адрес ссылки.

И вот чему я был удивлен. Адрес, который хранит указатель и адрес ссылки - одинаковы, но значения у них разные:

qDebug() << "*ptr: "<< ptr << "-" << *ptr; // *ptr: 0x28ff10 - 6
qDebug() << "&i: "<< &i << "-" << i; // &i : 0x28ff10 - 5

Объясните пожалуйста, как так происходит? и почему const_cast нельзя вызвать для константных типов значений?

PS: Посоветуйте какую-нибудь легкодоступную для понимая книжечку по азам С++, если можно. Книги читать не люблю, но, так понимаю, без них никак. Заранее благодарен.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Влад
  опции профиля:
сообщение 24.9.2011, 11:29
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Компилятор GCC 4.5
#include <iostream>
using namespace std;

const int i = 5;

int main()
{
    int *ptr = (int*)&i;
    (*ptr)++;   // ожидается инкремент i
                // Хе-хе. Как бы не так! Здесь реально происходит Access Violation

    return 0;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_D_*
сообщение 24.9.2011, 12:36
Сообщение #3





Гости








    


Цитата(Влад @ 24.9.2011, 11:29) *
Компилятор GCC 4.5
#include <iostream>
using namespace std;

const int i = 5;

int main()
{
    int *ptr = (int*)&i;
    (*ptr)++;   // ожидается инкремент i
                // Хе-хе. Как бы не так! Здесь реально происходит Access Violation

    return 0;
}


Здесь происходит Access Violation по той причине, что константа у вас находится в статической области памяти. В этом случае измнять ее не получится, поскольку она помещается в специального рода память.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 14:52