Inicjalizacja stałego wskaźnika, operator const_cast

0

InicjalizujĘ stały wskaźnik wskaźnikiem do stałych:


int obiekt = 100;
const int *Cintw = &obiekt;

int *const intCw = const_cast<int *>(Cintw);
//int *const intCw = const_cast<int * const>(Cintw);

Czy jest w tym wypadku jakaś różnica pomiędzy zapisem <int*> a <int * const>. Dzięki <int *> zapominamy że był to wskaźnik do stałej, ale chyba nie trzeba już nadawać przydomka const odpowiedzialnego na nieruchomość wskaźnika jak w zapisie <int * const>, bo jest on dodawany przez domniemanie. Wydaje mi się, że wystarczy zapis <int *> bo przecież gdybyśmy przypisywali zwykły wskaźnik to wystarczy:

int obiekt = 100;
int *intw = &obiekt;
int *const intCw = intw;
0

Czy jest w tym wypadku jakaś różnica pomiędzy zapisem <int*> a <int * const>
tak, jest to inny typ danych.

Dzięki <int *> zapominamy że był to wskaźnik do stałej
zacznijmy od tego, że "obiekt" nie jest stałą.

ale chyba nie trzeba już nadawać przydomka const odpowiedzialnego na nieruchomość wskaźnika jak w zapisie <int * const>
fakt, można, ale nie trzeba - zależy jak chcesz go potem używać

, bo jest on dodawany przez domniemanie
bzdura, nigdy. typ napisany przez Ciebie explicite, zostaje ZAWSZE taki jak podales. nigdy kompilator nic do niego nie dopisze. jedyne gdzie kompilator sobie cos domniema to template'y oraz nadchodzace "auto" w C0x/C1x ew. var w .Net

Wydaje mi się, że wystarczy zapis <int *>
tak, w zupelnosci wystarczy


w skrocie:

int x = 5;
int const xc = 5;
int * px = 0;
int const * pxc = 0;
int * const pcx = 0;
int const * pcxc = 0;

to wszytko są RÓŻNE typy danych, każdy z nich pozwala Ci na inną rzecz. Zwróc uwage, że intencjonalnie używam zapisu z const-po-prawej, żeby "const int" stojace po lewej nie zaciemniało struktury zapisu..

X jest zmienną modyfikowalną (typ jej wartosci: int)
XC jest zmienną niemodyfikowalną, jest stałą (typ jej wartosci: int)
PX jest zmienną modyfikowalną (typ wartosci: int*, wartość tej zmiennej jest wskaznikiem na modyfikowalny element typu: int)
PXC jest zmienną modyfikowalną (typ wartosci: int const*, wartość tej zmiennej jest wskaznikiem na NIEmodyfikowalny element typu: int, to jest wskaznik-na-stałą)
PCX jest zmienną NIEmodyfikowalną (typ wartosci: int*, wartość tej zmiennej jest wskaznikiem na modyfikowalny element typu: int)
PCXC jest zmienną NIEmodyfikowalną, jest stałą (typ wartosci: int const *, wartość tej zmiennej jest wskaznikiem na NIEmodyfikowalny element typu: int)

stąd, pozniej:

x = 1; //ok

xc = 1; // blad - nie mozna modyfikowac zmiennej const

px = &x; //ok
*px = 4; //ok

pxc = &xc; //ok, wskaznik nie jest staly, mozna go zmieniac na inny
*pxc = 4; //blad, nie mozna modyfikowac wskazywanej przez niego stalej rzeczy

pcx = &x; //blad, wskaznik jest staly, nie mozna go modyfikowac
*pcx = 4; //ok, wskazywana rzecz nie jest stala, mozna ja modyfikowac

pcxc = &x; //blad, wskaznik jest staly
*pcxc = 4; //blad, wskazywana recz tez jest stala

rozumiesz teraz?

//edit: zaczalem dopisywac wyjasniania dot. konwersji danych, ale przy wysylaniu mi sie lacze zresetowalo i poprawka do postu wyparowala..
tymczasem wiec poczytaj sobie http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.16 oraz punkt nastepny

1 użytkowników online, w tym zalogowanych: 0, gości: 1