• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed automatyczne wywolanie konstruktora

Object Storage Arubacloud
0 głosów
308 wizyt
pytanie zadane 11 marca 2019 w C i C++ przez Dawid Markiewicz Obywatel (1,590 p.)
zamknięte 11 marca 2019 przez Dawid Markiewicz

witam mam instrukcje 

Stonewt x = z + y;

z + y to przeciązone operatory

Stonewt operator+(const Stonewt & ob, const Stonewt & oj)
{
	return Stonewt(ob.pounds + oj.pounds);
}

czy da sie (niejawnie) wywolac domyslny konstruktor zanim obiekt x zostanie zainicjowany instukcją z + y ?

komentarz zamknięcia: Problem rozwiązany
2
komentarz 11 marca 2019 przez mokrowski Mędrzec (155,460 p.)
Podaj cel. Czy to może jest quiz jak załamać teorię typów?

1 odpowiedź

0 głosów
odpowiedź 11 marca 2019 przez criss Mędrzec (172,590 p.)
wybrane 11 marca 2019 przez Dawid Markiewicz
 
Najlepsza

Niby się da.. ale radziłbym znaleźć inne rozwiązanie (tak przerobić, żebys nie musiał go wołać).

W tym konkretnym przypadku uruchomiony zostanie konstruktor przenoszący, więc musiałbyś sobie go jawnie zdefiniować (C++ niejawnie definiuje go za ciebie jeśli jest to możliwe) i użyć delegowania konstruktorów, żeby zawołać domyślny kontruktor (zostanie wykonany przed).

class Stonewt {
public:
   Stonewt(Stonewt&& other) : Stonewt() // tutaj wolany jest kontruktor domyslny; wykonywany jest przed kodem tego konstruktora
   {
      // tutaj przekopiowujesz wszystkie membery obiektu other do obiektu na ktorym wykonuje sie konstruktor
      // lub przenosisz zgodnie z semantyką przenoszenia
   }
};

Jeśli jednak kod wygladalby w ten sposob:

Stonewt zy = z + y;
Stonewt x = zy;

To uruchomiony zostanie konstruktor kopiujący (tj. Stonewt(const Stonewt&)) i musisz też z nim postąpić podobnie...

Wg mnie: brzydkie i szkoda zachodu

komentarz 12 marca 2019 przez Hiskiel Pasjonat (22,830 p.)
A to nie jest tak, że w pierwszym przypadku jest konstruktor kopiujący, a w drugim operator przypisania?
komentarz 12 marca 2019 przez criss Mędrzec (172,590 p.)
Nie. Dlaczego?
komentarz 12 marca 2019 przez Hiskiel Pasjonat (22,830 p.)

Dobra, w pierwszym przypadku mogę constructor, no to rval, ale w drugim przypadku jest przecież operator=, bo wywołanie kopiującego wyglądałoby jakoś tak:

Stonewt foo = ...;
Stonewt bar(foo);

 

komentarz 12 marca 2019 przez criss Mędrzec (172,590 p.)
To dlaczego twoim zdaniem Stonewt x = y + z; uruchamia konstruktor a Stonewt bar = foo; uruchamia już operator przypisania? Brak konsekwencji. Z resztą... jak chcesz, to sobie przetestuj. To jest inicjalizacja więc uruchomi się konstruktor.

Stonewt bar = foo; oraz Stonewt bar(foo); to jest jedno i to samo.

Podobne pytania

0 głosów
2 odpowiedzi 114 wizyt
pytanie zadane 9 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
2 odpowiedzi 835 wizyt
0 głosów
1 odpowiedź 577 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...