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

Konstruktor kopiujący a operator przypisania C++

Object Storage Arubacloud
0 głosów
12,303 wizyt
pytanie zadane 22 października 2015 w C i C++ przez Macek Kolo Mądrala (5,480 p.)
Zastanawiam się jakie są różnice. Dzisiaj miałem kolokwium i tylko to miałem źle, bo zamiast konstruktora kopiującego przeciążyłęm operator przypisania. Może ktoś mi te różnice wytłumaczyć?

3 odpowiedzi

+4 głosów
odpowiedź 22 października 2015 przez Radfler VIP (101,030 p.)
wybrane 22 października 2015 przez Macek Kolo
 
Najlepsza

Konstruktor, jak sama nazwa wskazuje, konstruuje obiekt, tz. wywoływany jest (tylko i wyłącznie) w czasie jego tworzenia. Celem jego jest skopiowanie danych z innego obiektu do siebie. Operatora przypisania używamy już w czasie istnienia obiektu do uczynienia go identycznym (lub prawie) do obiektu po prawej, np.

#include <iostream>

struct Foo {

  Foo() = default;

  // Konstruktor kopiujący
  Foo(const Foo&) {
    std::cout << "copy\n";
  }

  // Operator przypisania
  Foo& operator=(const Foo& other) {
    // Sprawdzenie czy nie przypisujemy obiektu do samego siebie
    if(this != &other) {
      std::cout << "assing\n";
    }
    // Zwrócenie referencji do samego siebie
    return *this;
  }

};

int main() {

  Foo one;

  Foo two(one); // Foo(const Foo&)

  one = two; // Foo::operator=(const Foo&)

}

O to chodzi? :)

komentarz 22 października 2015 przez Macek Kolo Mądrala (5,480 p.)
ale czy błędem jest jeśli użyję przeciążenia zamiast konstruktora? Bo dla mnie nie ma różnicy.
komentarz 22 października 2015 przez Radfler VIP (101,030 p.)

No w sumie błędem to nie jest, jednak definiowanie konstruktora kopiującego jest bardzo ważne. Dzięki niemu będziesz mógł wysłać obiekt do funkcji przez wartość, oraz Twoja funkcja będzie mogła go zwrócić przez wartość. Operator przypisania nie zapewni Ci takich "przywilejów". Jeżeli tego konstruktora nie zdefiniujesz konieczne będzie posługiwanie się wskaźnikami/referencjami. Możesz też zrobić taką sztuczkę:

struct Klasa {

  Klasa(const Klasa& obiekt) {
    // Wywołanie operatora przypisania 
    this->operator=(obiekt);
  }

  Klasa& operator=(const Klasa& obiekt) {
    // Kopiowanie, bla bla bla...
    return *this;
  }

};

 

Aczkolwiek nie polecam tego :)

komentarz 22 października 2015 przez Macek Kolo Mądrala (5,480 p.)
Dzięki, teraz wiem za co nie dostałem punktów, choć dla mnie to śmieszne bo akurat zrobięłm funkcję w której przekazywałem przez referencję objekt. I nigdzie nie musiałem przez wartość. Niemniej dziękuję.
+1 głos
odpowiedź 22 października 2015 przez Dorion300 Szeryf (90,250 p.)
Konstruktor jest wywoływany tylko raz przy tworzeniu obiektu a operator przepisania wykonuje funkcję "Operator=" z określonymi parametrami.
+1 głos
odpowiedź 22 października 2015 przez furas Maniak (53,800 p.)
Konstruktor kopiujący ma obowiązek zrobić duplikat obiektu tak aby dwie różne zmienne wskazywały dwa różne obiekty w pamięci RAM. Przypisanie nie ma obowiązku tworzenia duplikatu i dwie różne zmienne mogą wskazywać ten sam obiekt w pamięci RAM.
komentarz 22 października 2015 przez Macek Kolo Mądrala (5,480 p.)
mogą, ale nie musz? To jest zależne ode mnie? Tzn. od implementacji przeciążenia?

Podobne pytania

0 głosów
4 odpowiedzi 16,812 wizyt
0 głosów
1 odpowiedź 422 wizyt
pytanie zadane 28 kwietnia 2018 w C i C++ przez konu33 Nowicjusz (210 p.)
–1 głos
1 odpowiedź 806 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!

...