Zwracanie stałej przez wartość

0

Witam.
Czytam sobie właśnie "Thinking in c++" i napotkałem jedną rzecz której nie do końca rozumiem i nie potrafie z tekstu książki wywnioskować o co tu chodzi ... albo jestem tępy ;-) albo zbyt dociekliwy :p
Oto kod:

#include <iostream>
#include <cstdlib>

class X
      {
      int i;
      public:
             X(int ii = 0);
             void modify();
      };
      
X::X(int ii) {i =ii;}

void X::modify()
     {
      cout << "dokonuję modyfikacji i = " << i<< endl;
      i++;
      cout << " a teraz i = " << i << endl;
     }
     
X f5()
  {
  return X();
  }
  
const X f6()
      {
      return X();
      }

void f7(X& x)
     {
     x.modify();
     }
     
      


int main()
{

f5() = X(1); // zwracana wartość nie jest stałą
f5().modify();

// ! f7(f5());
// ! f6() = X(1);
// ! f6().modify();
// ! f7(f6());


      system("PAUSE");
      return 0;
}

nie rozumiem wywołań

f5() = X(1);
f5(). modify();

...
itd ...
przecież kontruktor nic nie zwraca ... funkcja nieprzyjmuje żadnych argumentów ..
nie wiem na czym polega to przypisanie ..
podekreślam że komentarz w kodzie "// zwracana wartość nie jest stałą" nie jest mojego autorstwa .. w końcu nie wiem gdzie to "zwracanie".
jak to załapie to kwestia zwracania stałych przez funkje "wejdzie" mi już łatwo ..
pomoże ktoś ?
z góry dzięki

0

Zajrzalem do ksiazki (zainteresowani: str. 277). Konstruktor ( w tym wypadku domyslny, nie deklarowany jawnie) po prostu inicjuje obiekt klasy X a intrukcja return zwraca... i tu mam watpliwosc - wskaznik do klasy czy... ? ja z kolei nie bardzo wyobrazam sobie co tak naprawde znaczy przekazac obiekt przez wartosc. ale zdaje sie ze gdzies w ksiazce jest o tym...

co do linii

f5()=X(1)

to wyjasnia akapit poprzedzajacy przyklad, czyli "zwracanie stalych przez wartosc jest wazne w przypadku typow zdefiniowanych przez uzytkownika. Jezeli funkcja zwraca przez wartosc obiekt jako stala, to zwrocona wartosc nie moze byc l-wartoscia (to znaczy nie mozna do niej dokonac przypisania ani zmodyfikowac jej w jakis inny sposob)...
a to by oznaczalo, ze istotnie temu co zwraca funkcja f6() - czyli stalemu obiektowi nie mozna przypisac wartosci z prawej strony

0

co do linii

f5()=X(1)

to wyjasnia akapit poprzedzajacy przyklad, czyli "zwracanie stalych przez wartosc jest wazne w przypadku typow zdefiniowanych przez uzytkownika. Jezeli funkcja zwraca przez wartosc obiekt jako stala, to zwrocona wartosc nie moze byc l-wartoscia (to znaczy nie mozna do niej dokonac przypisania ani zmodyfikowac jej w jakis inny sposob)...

wszystko ok tylko gdzie tu zwracanie ? przeicież X(1) to jest jawne wywołanie konstruktora o ile sie nie myle. Tyle że konstruktor nic nie zwraca. Nawet void i jest w wielu miejscach w tej książce podkreślane. Więc skąd to przypisanie ? Gdyby było
f5(X(1))
to bym jeszcze zrozumial ale to co tam stoi to jakoś w moim wyobrażeniu się nie mieści.

a to by oznaczalo, ze istotnie temu co zwraca funkcja f6() - czyli stalemu obiektowi nie mozna przypisac wartosci z prawej strony

i tu sytuacja sie powtarza .. gdzie jest to przypisanie do obiektu ?
może jakaś "tęga głowa" (a wiem że takich tu nie brakuje :) ) coś mi wyjaśni lub kwestia ta wyjaśni się dalej w tej książce ... lub innej ;-)

0

co do linii

f5()=X(1)

to wyjasnia akapit poprzedzajacy przyklad, czyli "zwracanie stalych przez wartosc jest wazne w przypadku typow zdefiniowanych przez uzytkownika. Jezeli funkcja zwraca przez wartosc obiekt jako stala, to zwrocona wartosc nie moze byc l-wartoscia (to znaczy nie mozna do niej dokonac przypisania ani zmodyfikowac jej w jakis inny sposob)...

wszystko ok tylko gdzie tu zwracanie ? przeicież X(1) to jest jawne wywołanie konstruktora o ile sie nie myle. Tyle że konstruktor nic nie zwraca. Nawet void i jest w wielu miejscach w tej książce podkreślane. Więc skąd to przypisanie ?

Konstruktor zwraca skonstruowany obiekt. Ponizsza konstrukcja:

X obiekt;
obiekt = X(1);

jest rownowazna:

X obiekt;
obiekt = (X)1;

Jedyna roznica, to to, ze w poscie oryginalnym po lewej stronie zamiast zmiennej stoi wywolanie funkcji f5(), ktore zwraca obiekt tymczasowy (przez wartosc). Operator = jest wykonywany na samym koncu, po wykonaniu wartosciowania lewej i prawej strony.

W tej linii:

f5()=X(1)

kompilator powinien wyrzucic warning, bo przypisywanie czegos do wartosci tymczasowej jest bez sensu. Co innego, gdyby funkcja f5() zwracala referencje...

0

taak, zgadza sie to, ze w wyniku dzialania funkcji f5() otrzymujemy skontruowany obiekt - ale jak to sie dzieje, ze nigdzie wczesniej w kodzie nie jest zadeklarowany zaden obiekt tego typu - jest tylko goly prototyp klasy! jedyne wytlumaczenie jakie mi sie nasuwa, to to ze kompilator niejawnie tworzy obiekt tego typu. tylko najprawdopodobniej nie mozna sie do niego w zaden sposob dostac...

0

Krolik : dzieki za odpowiedź .. od razu mi lepiej ... :)
raybones : chyba chodzi o to ze kompilator tworzy sam obiekt tymczasowy ... nie trzeba go tworzyc samemu ... tak jak napisał krolik ...
w domu przeczytam to na spokojenie jeszcze raz .... podładowany nowym spojrzeniem dzieki Krolikowi chyba załapię to już w 100% :)

0

taak, zgadza sie to, ze w wyniku dzialania funkcji f5() otrzymujemy skontruowany obiekt - ale jak to sie dzieje, ze nigdzie wczesniej w kodzie nie jest zadeklarowany zaden obiekt tego typu - jest tylko goly prototyp klasy!

Prrzeciez funkcja f5 konstruuje jawnie obiekt. Popatrz na linie:

return X()

Tu jest wywolany konstruktor klasy X z domyslnym parametrem 0. Konstruktor ten JEST zdefiniowany wczesniej w kodzie, wiec kompilator wie, co ma wykonac. Obiekt ten znajduje sie na oczywiscie na stosie. Miejsce na stosie na ten obiekt jest rezerwowane przed wywolaniem funkcji f5.

0

ok, nie mam wiecej pytan :)

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