Obiekty tymczasowe - Pytanie

0

Witam, proszę odpowiedzieć mi na pytanie dlaczego, skoro przekazywane są argumenty do funkcji przez wartość to tworzone obiekty tymczasowe są domyślnie stałe, i które obiekty są obiektami tymczasowymi, czy są to zmienne które są kopiami argumentów w ciele funkcji? Bo skoro tak to przecież możemy wykonywać na nich różne operacje np:inkrementacji i dekrementacji? Czy może obiekty tymczasowe i kopie argumentów to dwie różne rzeczy?

#include <iosteam>
using namespace std;

int f(int x,int y)
{
x++;
x+=y;
return x;
}

main()
{
int x=3,y=8,z=9;
z=f(x,y);
}

0

Nie uczą już w gimnazjum pisać pełnymi zdaniami, tak żeby inni ludzie mogli to zrozumieć?

Argumenty przekazywane do funkcji przez wartość nie są wcale domyślnie stałe.
Argumenty przekazywane do funkcji przez wartość są kopiowane i wewątrz funkcji pracujesz jedynie na ich lokalnej kopii. Są to zwykłe zmienne automatyczne/lokalne. Po wyjściu z ciała funkcji ich wartość jest tracona. Możesz dokonywać na nich operacji wewnatrz funkcji, bo to są zwykłe zmienne.

0

Ale mam wyraznie napisane w ksiazce Eckela(Thinking in C++): Jest jednak isotna kwestia, związana z obiektami tymczasowymi-są one tworzone automatycznie jako stałe. Z uwagi na to, że zazwyczaj nie istnieje możliwość wykonywania operacji na obiektach tymczasowych, nakazanie zrobienia czegoś co zmieniłoby obiekt tymczasowy jest z pewnością pomyłką, ponieważ nie ma sposobu na to by poźniej wykorzystać tę informację. Dzięki temu że wszystkie obiekty tymczasowe stają się automatycznie stałymi, kompilator ma możliwość sygnalizowania takich pomyłek.
Zatem może źle sformułowałem pytanie, więc powinno ono brzmieć: Czym się różnią wspomniale przez Ciebie lokalne(automatyczne) kopie obiektów, od obiektów tymczasowych?

0

Przeczytaj ten rozdział jeszcze raz...

0

A jaki jest kontekst tego zdania? Bo wydaje mi się ze chodzi tu o coś zupełnie innego niż kopiowanie argumentów. Chodzi bardziej o sytuację gdy ktoś napisze coś w stylu

i++++;

albo

i++=10;

Czyli gdy próbujesz przypisać wartość do obiektu tymczasowego. No bo wywołanie i++ (czyli wywołanie operatora postinkrementacji) zwraca ci tylko pewną wartość (a nie referencje).
Definicja tego operatora wygląda tak:

int operator++(int) //nie int& operator++(int) tylko int operator++(int), więc zwraca wartość!
{
  int stara_wartosc=this->value; //zapamiętujemy wartość w zmiennej lokalnej, ona zniknie po wyjsciu z funkcji!
  (this->value)++;
  return stara_wartosc; //zwracamy starą wartość zmiennej, a nie zmienną jako taką
}

Istotą jest to, ze po wyjściu z funkcji ta zmienna lokalna zniknie i nie będzie do niej dostępu. Co wiecej wartość która byla w tym miejscu moze też ulegać zmianie. Mamy jedynie pewność że wartość jest poprawna zaraz po wyjsciu z funkcji, czyli tylko w chwili jej wywołania:

int x = funkcja();

Mamy pewność ze funkcja zwróci nam poprawną wartość. Ale gdyby funkcja zwracała int& a nie int, to mogłoby sie okazać ze za chwile wartość tej referencji byłaby zupełnie inna.

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