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

[C++] Rzutowanie na referencję typu string i zwracanie referencji w funkcji

Ostatnio zmodyfikowano 2013-11-27 23:10
Autor Wiadomość
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ę :)


C/C++
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;
}
P-97644
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.
P-97646
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.
P-97650
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().
P-97663
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
P-97708
« 1 »
  Strona 1 z 1