Zmienna obiekowa/ referencja czy inny zwierz?

0

Mam pytanie co do nazewnictwa oraz semantyki 2-och fragmentów kodu.
Zmienna która wskazuje na obiekt alokowany dynamicznie nazywa się wskaźnikiem.

  1. Jak nazywa się zmienna która przechowuje obiekt alokowany statycznie?
    ( Kod nr1, zmienna obj ). Jest to referencja/ zmienna obiektowa/ wskaźnik czy jak ?

  2. Kod nr 1 wyswietla : jestem animal
    a kod nr 2 wyswietla : jestem mammal. Wiem o co chodzi w kodzie nr2 potrafię to opowiedzieć, ale kod nr1, jaka semantyka operatora = ??

  • brak konstruktorów kopiujących, operatorów przypisania w klasach CMammal i CAnimal
  • CMammal dziedziczy virtualnie po CAnimal
  • yell jest funkcją wirtualną

Kod nr1

CMammal obj;

CAnimal obj2 = obj;
obj2.yell(); 

Kod nr2

CMammal mammal;
CAnimal animal;

CAnimal& polymorph = mammal;
polymorph.yell();
1
  1. obiekt / zmienna typu CMammal

Pamietaj, ze w C++ wszystko jest przekazywane domyslnie przez value nie przez referencje (to robi np java czy c#

  1. Jezeli nie zdefiniowales, to klasa zapewne zdefiniowala to sama wiec jest domyslne zachowanie operatora= (przepisuje wszystkie wartosci klasy te ktore moze)
CAnimal& polymorph = mammal; 

potrafisz wytlumaczyc dlaczego tak zrobiles?

zapoznaj sie z operatorem new, nastepnie prawie ze o nim zapomnij (bo uzywanie go to intyidom) i skorzystaj z smart pointerow (unique_ptr, shared_ptr etc) oraz z funkcji typu make_unique

0

Tak c++ pass by value.
Myslalem ,że jak statycznie tworzy sie obiekt, to adres do niego przechowuje referencja i po prostu do referencji polymorph chcialem podpiąć obiekt, którego adres trzyma referencja mammal

0

tu nic nie tworzysz statycznego.

0

Ale używając new mogę powiedzieć, że następuje dynamiczna alokacja pamięci prawda?
Czyli dla CMammal mammal, mówić, że obiekt tworzony na stosie i tyle

1

uzywajac new tworzysz zmienna na stercie, mozesz powiedziec, ze ja tworzysz dynamicznie ale to bardzo naciagane. Co najwyzej mozna tworzyc dynamicznie to tablice (nie obiekt/zmienna).

Tak obiekt zostal stworzony na stosie. Mozesz powiedziec rowniez, ze jest to zmienna lokalna (bo za klamerka } przestanie istniec, destruktor sam sie wywola)

0

Kod 1
Ok ☺ Więc dlaczego on sie wgl skompilowal, skoro defaultowy operator = bierze referencje a nie kopie? Kompilator potraktowal zmienna "obj" jako referencje?

1

a dlaczego nie mialby sie skompilowac? tak, zostal przekazany jako stala referencja (const &)

do poczytania wiecej na ten temat tutaj
http://en.cppreference.com/w/cpp/language/copy_assignment

0

Czyli podsumowując.
Kod 1.
Tworze obiekt typu CMammal
Obiektowi typu CAnimal kopiuje wartości z obj. ( CTOR kopiujący )
Zwraca "jestem CAnimal" bo jest obiektem typu CAnimal i wywola swoją funkcję.

Kod 2
Tworze obiekt typu CMammal.
Referencji na obiekt CAnimal( adresowi ) przypisuję adres obiektu mammal
A ze funkcja yell jest wirtualna a polymorph trzyma adres do CMammal, zwróci" jestem CMammal"

0

prawie, myslisz konstruktor kopiujacy z operatorem przypisania ktory kopiuje. Reszta sie zgadza

1
korytko94 napisał(a):

Zmienna która wskazuje na obiekt alokowany dynamicznie nazywa się wskaźnikiem.

Wskaźnik może równie dobrze wskazywać na obiekt statyczny lub automatyczny (p. niżej).

korytko94 napisał(a):
  1. Jak nazywa się zmienna która przechowuje obiekt alokowany statycznie?
    ( Kod nr1, zmienna obj ). Jest to referencja/ zmienna obiektowa/ wskaźnik czy jak ?

Statycznie alokowane są zmienne statyczne i globalne. Są jeszcze zmienne automatyczne, które są alokowane dynamicznie, ale nie przez new czy coś podobnego, tylko na stosie -- czyli zwykłe zmienne lokalne niestatyczne. Mówi się o nich czasem 'statyczne', ale to niepoprawne. Poprawnie jest: właśnie 'automatyczne'.

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