Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zmiana obiektu const

Ostatnio zmodyfikowano 2014-02-04 11:47
Autor Wiadomość
karaluszek
Temat założony przez niniejszego użytkownika
Zmiana obiektu const
» 2014-02-02 13:07:50
Czy to prawda, że używając odpowiedniego rzutowania można zmienić obiekt stały (zadeklarowany jako const) ?
P-103848
alixir
» 2014-02-02 13:21:32
Kiedyś dało się w taki sposób:

C/C++
#include <iostream>

int main() {
   
    const int stala = 10;
    int * wsk;
    wsk = const_cast < int *>( & stala );
   
    std::cout << "A=" << stala << std::endl; // ewentualnie wyświetl *wsk
    * wsk = 20;
    std::cout << "A=" << stala << std::endl; // ewentualnie wyświetl *wsk
   
    return 0;
}

Obecnie chyba żaden kompilator na to nie zezwoli, ewentualnie zachowanie będzie niezdefiniowane.
P-103850
karaluszek
Temat założony przez niniejszego użytkownika
» 2014-02-02 13:30:21
Mam takie pytanie na egzaminie i co tu odpowiedzieć...
P-103851
alixir
» 2014-02-02 13:35:18
Ja bym odpowiedział, że w takim przypadku zachowanie będzie niezdefiniowane. Ponadto jest to bardzo niezalecane.

Aha pytanie było odnośnie C++ czy C bo to kluczowa sprawa.
Dlatego, że C nie posiadał takich zabezpieczeń i dało się to obejść w podany wyżej sposób, który w C wygląda tak:

C/C++
#include <stdio.h>

int main() {
   
    const int stala = 10;
    int * wsk;
    wsk =( int * )( & stala );
   
    printf( "A=%d\n", stala );
    * wsk = 20;
    printf( "A=%d\n", stala );
   
    return 0;
}
P-103852
karaluszek
Temat założony przez niniejszego użytkownika
» 2014-02-02 13:52:03
C++.
Niestety jest tylko ABC.

A - nie moze byc zmieniony w zadnym wypadku.
B - nie moze byc zmieniony bezposrednio.
C - moze byc zmieniony przez rzutowanie.
P-103855
pekfos
» 2014-02-02 13:55:54
Czy to prawda, że używając odpowiedniego rzutowania można zmienić obiekt stały (zadeklarowany jako const) ?
Nie. W żadnym wypadku.

Aha pytanie było odnośnie C++ czy C bo to kluczowa sprawa.
Dlatego, że C nie posiadał takich zabezpieczeń i dało się to obejść w podany wyżej sposób, który w C wygląda tak:
W C to też jest UB.
P-103856
alixir
» 2014-02-02 13:58:29
To i tak odpowiedziałbym A.
P-103857
karaluszek
Temat założony przez niniejszego użytkownika
» 2014-02-02 16:17:57
A co powiecie o takim kodzie:

C/C++
void changeFirst( char * str, char c ) {
    str[ 0 ] = c;
}

int main( void ) {
   
    const char name[] = "Jenny";
   
    cout << name << endl; //Jenny
   
    // name[0]='K';
   
    changeFirst( const_cast < char *>( name ), 'K' );
   
    // changeFirst(name,'K');
   
    cout << name << endl; //Kenny
   
}
P-103874
« 1 » 2
  Strona 1 z 2 Następna strona