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

Do czego służy rzutowanie const_cast ?

Ostatnio zmodyfikowano 2014-11-28 22:35
Autor Wiadomość
wilkoo13
Temat założony przez niniejszego użytkownika
Do czego służy rzutowanie const_cast ?
» 2014-11-28 21:51:18
W mojej książce pisze: jeżeli potrzebna jest konwersja z typu oznaczonego modyfikatorami const lub volatile do typu nonconst lub nonvolatile należy użyć słowa kluczowego const_cast.
C/C++
//: C03:const_cast.cpp
int main() {
    const int i = 0;
    int * j =( int * ) & i; // Deprecated form
    j = const_cast < int *>( & i ); // Preferred
    // Can't do simultaneous additional casting:
    //! long* l = const_cast<long*>(&i); // Error
    volatile int k = 0;
    int * u = const_cast < int *>( & k );
} ///:~
Nie rozumiem wgl tego kodu powyżej. Po co taka zabawa z adresami, i ze wskaźnikami? Nie lepiej jest pprst:
C/C++
const int n = 5;
int a = 6;
a = n
Do czego wgl służy to rzutowanie?
P-121660
Monika90
» 2014-11-28 22:35:00
Powiedzmy, że masz funkcję która przyjmuje wskaźnik do czegośtam i wiemy (z dokumentacji) że ta funkcja nie modyfikuje obiektu do którego odnosi się wskaźnik, lecz niestety autor tej funkcji nie znał C++ i nie wiedział że powinien użyć const. Np.:
C/C++
void open_file( char * file_name );

A ty piszesz taką funkcję
C/C++
void f( const std::string & file_name )
{
}
i chcesz w niej wywołać open_file, jak to zrobić? To jest jedno zastosowanie const_cast.

Inne zastosowanie - masz klasę która ma dwie wersje funkcji składowej, jedną z atrybutem const, a drugą bez (jak operator [] w std::vector), wtedy możesz użyć const_cast żeby zaimplementować jedną z wersji przy pomocy drugiej i uniknąć duplikacji kodu. Przykład:
C/C++
class Container
{
    const int & operator []( int i ) const
    {
        //tutaj wykonujesz jakieś skomplikowane operacje,
        //by wreszie zwrócić referencję do jakiegoś elementu
    }
   
    int & operator []( int i )
    {
        //a tutaj korzystasz z tego co już masz napisane
        return const_cast < int &>(( * const_cast < const Container *>( this ) )[ i ] );
    }
   
};

Z pewnością są i inne zastosowania, ale niech to ci wystarczy, na razie.
P-121663
« 1 »
  Strona 1 z 1