[C++] Rzutowanie na referencję typu string i zwracanie referencji w funkcji
Ostatnio zmodyfikowano 2013-11-27 23:10
maf2 Temat założony przez niniejszego użytkownika |
[C++] Rzutowanie na referencję typu string i zwracanie referencji w funkcji » 2013-11-27 12:43:58 Witam, Mam problem ze zrozumieniem kodu i proszę o wytłumaczenie: Chodzi mi o wytłumaczenie tego zwracania. Nie wiem jak mam to rozumieć. Najpierw mam rzutowanie na referencję typu string a następnie zwracam referencję. Czyli zwracam referencję czy zwracam referencję do referencji typu string ??? xD?? Pogubiłem się :( I jeszcze jedno co się dzieje jak wywołam return *this(tak też działa) zamiast return (const string&) *this ? Łopatologicznie proszę :) class Student : private std::string { private: public: Student() : std : string( "brak" ) { } const std::string & Name() const; };
const std::string & Student::Name() const { return( const string & ) * this; }
|
|
pekfos |
» 2013-11-27 13:00:32 Zwracasz referencję na std::string. I jeszcze jedno co się dzieje jak wywołam return *this(tak też działa) zamiast return (const string&) *this ? |
To samo. |
|
maf2 Temat założony przez niniejszego użytkownika |
» 2013-11-27 13:34:00 No dobrze tyle, że dalej to nie jest jasne do końca dla mnie. A jak bym napisał tak (const string) *this. Czyli bez referencji ? W funkcji jest dalej, że zwracam referencję.
Jaka jest różnica miedzy *this a (const string&) *this ? Raz jest jawnie raz nie jawnie no ale co się dzieje jak wywołuje niejawnie ? Jakiś konstruktor kopiujący jest wywoływany ? Nie rozumiem mechanizmu działania. |
|
Monika90 |
» 2013-11-27 15:52:11 Może to Ci pomoże: this to jest wskaźnik do bieżącego obiektu, u ciebie jego typem jest const Student * . Z kolei wyrażenie * this ma typ const Student & , czyli referencja do bieżącego obiektu (to jest uproszczenie, bo tak naprawdę jest to L-wartość typu const Student). Ponieważ klasa Student dziedziczy z klasy std::string, to można referencję do std::stringa zainicjalizować za pomocą referencji do Studenta i żadne rzutowanie nie jest potrzebne. Nie ma tu też miejsca żadne kopiowanie obiektów, po prostu zwracasz referencję do istniejącego obiektu, tego na rzecz którego została wywołana funkcja Name(). |
|
maf2 Temat założony przez niniejszego użytkownika |
» 2013-11-27 23:10:03 No włąśnie to przykład z książki Stephen Prata "Język C++ Szkola programowania". W książce jest takie zdanie odnośnie tego przykładu: "Aby uniknąć wywoływania konstruktorów i tworzenia nowych obiektów, możemy użyć rzutowania typu do utworzenia referencji:
const string & Student::Name() const { return (const string &) *this; }
Dlatego wyciągnąłem wniosek być może błędny, że bez rzutowania wywoływany jest jakiś konstruktor. I stąd moje rozterki z tym przykładem.
Chyba już wiem o co chodziło autorowi.:) Dziękuję za pomoc |
|
« 1 » |