const_cast czy moze posluzyc do edycji stalego obiektu ?

Odpowiedz Nowy wątek
2011-07-10 12:05
0

Witam wszystkich.
Załapałem główne zastosowanie tego rzutowania ale czy nie można nim oszukiwać kompilatora. Wklepałem więc krótki kawałek kodu i bardzo się zdziwiłem.

#include <iostream>
using namespace std;
 
int main()
{
    const int stala = 5;
 
    int *wsk = const_cast<int*>(&stala);
 
    *wsk = 150;
 
    cout.width (10);
    cout << "wsk " << wsk << " " << *wsk << "\n";
    cout.width (10);
    cout << "stala " << &stala << " " << stala << "\n";
 
    return 0;
}

a oto wynik:

  wsk 0x28ff08 150
stala 0x28ff08 5

Nie rozumiem skoro wskaźnik pokazuje na ten sam adres co stała to dlaczego wyświetlają się dwie różne wartości pod tym adresem?

Pozostało 580 znaków

2011-07-10 14:04
ancymon
0

Wydaje mi się że to zależy od kompilatora.W CodeBlock otrzymałem takie same wyniki jak ty, natomiast w Visual Studio 2008 oba wskaźniki zwracały wartość 150.

Pozostało 580 znaków

2011-07-10 14:22
blee
0

jest to tak zwane, niezdefiniowane zachowanie.

Pozostało 580 znaków

2011-07-10 15:02
0

Generalnie jeżeli masz const int/ byte/ char/ whatever co nie jest tablicą to GCC zwykle zamienia wszystkie wystąpienia w kodzie na etapie kompilacji. bleble = stała byłoby zamienione wprost na bleble = 5.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
ściślej: 'cout << bleble' zostaje zamienione na 'cout << 5' - Azarien 2011-07-10 15:55

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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