Zalecane, 2024

Wybór Redakcji

Różnica między konstruktorem kopii a operatorem przypisania w C ++

Skopiuj konstruktora i operatora przypisania, są dwa sposoby inicjowania jednego obiektu przy użyciu innego obiektu. Podstawową różnicą między konstruktorem kopiowania i operatorem przypisania jest to, że konstruktor kopiowania przydziela oddzielną pamięć zarówno do obiektów, tj. Nowo utworzonego obiektu docelowego, jak i obiektu źródłowego. Operator przypisania przydziela tę samą lokalizację pamięci do nowo utworzonego obiektu docelowego, a także obiekt źródłowy.

Przeanalizujmy różnicę między konstruktorem kopii i operatorem przypisania.

Wykres porównania

Podstawa do porównaniaSkopiuj KonstruktoraOperator przypisania
PodstawowyKonstruktor kopiowania jest przeciążonym konstruktorem.Operator przypisania jest operatorem bitowym.
ZnaczenieKonstruktor kopiowania inicjuje nowy obiekt za pomocą już istniejącego obiektu.Operator przypisania przypisuje wartość jednego obiektu do innego obiektu, z których oba już istnieją.
Składniaclass_name (cont nazwa_klasy i nazwa_obiektu) {
// body konstruktora
}
class_name Ob1, Ob2;
Ob2 = Ob1;
Wywołuje(1) Konstruktor kopiowania wywoływany jest po zainicjowaniu nowego obiektu za pomocą istniejącego.
(2) Obiekt przekazany do funkcji jako parametr inny niż referencyjny.
(3) Obiekt jest zwracany z funkcji.
Operator przypisania jest wywoływany tylko wtedy, gdy przypisuje istniejącemu obiektowi nowy obiekt.
Przydzielanie pamięciZarówno obiekt docelowy, jak i obiekt inicjujący współdzielą różne lokalizacje pamięci.Zarówno obiekt docelowy, jak i obiekt inicjujący korzystają z tej samej przydzielonej pamięci.
DomyślnaJeśli nie zdefiniujesz żadnego konstruktora kopiowania w programie, kompilator C ++ niejawnie go dostarczy.Jeśli nie przeładujesz operatora "=", zostanie wykonana kopia bitowa.

Definicja Copy Constructor

"Konstruktor kopii" jest formą przeciążonego konstruktora . Konstruktor kopiowania jest tylko wywoływany lub wywoływany w celu inicjalizacji. Konstruktor kopiowania inicjuje nowo utworzony obiekt przez inny istniejący obiekt. Gdy do zainicjowania nowo utworzonego obiektu docelowego używany jest konstruktor kopiowania, zarówno obiekt docelowy, jak i obiekt źródłowy mają inną lokalizację pamięci. Zmiany dokonane w obiekcie źródłowym nie są odzwierciedlane w obiekcie docelowym. Ogólna forma konstruktora kopii jest

 class_ name (nazwa_klasy i nazwa_obiektu) {. // body konstruktora kopiowania. } // nazwa_obiektu odnosi się do obiektu po prawej stronie inicjalizacji. 

Jeśli programista nie utworzy konstruktora kopiowania w programie C ++, wówczas kompilator domyślnie dostarcza konstruktora kopiowania. Niejawny konstruktor kopii dostarczony przez kompilator wykonuje kopię obiektu źródłowego zgodnie z podziałem na elementy. Ale czasami kopia dla członków nie jest wystarczająca, ponieważ obiekt może zawierać zmienną wskaźnika. Kopiowanie zmiennej wskaźnikowej oznacza, że ​​kopiujemy adres zapisany w zmiennej wskaźnika, ale nie chcemy kopiować adresu zapisanego w zmiennej wskaźnika, zamiast tego chcemy skopiować wskazany wskaźnik. W związku z tym istnieje potrzeba wyraźnego "konstruktora kopii" w celu rozwiązania tego rodzaju problemów.

Konstruktor kopiowania jest wywoływany w trzech następujących warunkach:

  • Kopiuj konstruktor wywołuje, gdy nowy obiekt jest inicjowany z istniejącym.
  • Obiekt przekazany do funkcji jako parametr inny niż referencyjny.
  • Obiekt jest zwracany z funkcji.

Rozumiem konstruktora kopiowania na przykładzie.

 klasa copy {int num; public: copy () {} // domyślna kopia konstruktora (int a) {// inicjalizująca konstruktor num = a; } copy (copy & c) {// Kopiuj konstruktor num = c.num; } void show () {cout << num; }}; int main () {copy A (200); // Obiekt A utworzona i zainicjowana kopia B (A); // Kopiuj konstruktor zwany copy C = A; // Skopiuj konstruktor o nazwie D; D = A; // Kopiuj konstruktor nie wywołany, ponieważ obiekt D nie jest nowo utworzonym obiektem. // to operacja przypisania. return 0; } 

W powyższym kodzie wyraźnie zadeklarowałem konstruktora "copy (copy & c)". Ten konstruktor kopiowania jest wywoływany, gdy obiekt B jest inicjowany przy użyciu obiektu A. Drugi raz jest wywoływany, gdy obiekt C jest inicjowany przy użyciu obiektu A. Kiedy obiekt D jest inicjowany przy użyciu obiektu A, konstruktor kopiowania nie jest wywoływany, ponieważ podczas inicjalizacji D to już istnieje, a nie nowo utworzone. Stąd tutaj wywoływany jest operator przypisania.

Definicja operatora przypisania

Operator przypisania jest operatorem przypisującym C ++. Operator "=" służy do wywołania operatora przypisania. Kopiuje dane w jednym obiekcie identycznie jak inny obiekt. Operator przypisania kopiuje jeden obiekt na inny element członkowski. Jeśli nie przeładujesz operatora przypisania, wykona kopię bitową. Dlatego musisz przeciążyć operatora przypisania.

 klasa copy {int num; public: copy () {} // domyślna kopia konstruktora (int a) {// inicjalizująca konstruktor num = a; } void show () {cout << num; }}; int main () {copy A (200); // Obiekt A utworzona i zainicjowana kopia B (300); // Obiekt B utworzony i zainicjowany B = A; // operator przypisania wywołał kopię C; C = A; // operator przypisania wywołał return 0; } 

W powyższym kodzie, gdy objectA jest przypisany do obiektu B, operator przypisania jest wywoływany, ponieważ oba obiekty już istnieją. Podobnie jest w przypadku, gdy obiekt C jest inicjowany z obiektem A.

Kiedy wykonywane jest przypisanie bitowe, zarówno obiekt współdzieli tę samą lokalizację pamięci, jak i zmiany w jednym obiekcie odbijają się w innym obiekcie.

Kluczowe różnice między konstruktorem kopii i operatorem przypisania

  1. Konstruktor kopiujący jest przeciążonym kontruktorem, w którym jako operator przypisania jest operatorem bitowym.
  2. Za pomocą konstruktora kopiowania można zainicjować nowy obiekt z już istniejącym obiektem. Z drugiej strony, operator przydziału kopiuje jeden obiekt do drugiego obiektu, z których oba są już istniejące.
  3. Konstrukcja kopiowania jest inicjowana za każdym razem, gdy nowy obiekt jest inicjowany za pomocą istniejącego obiektu, gdy obiekt jest przekazywany do funkcji jako parametr bez odwołania lub gdy obiekt jest zwracany z funkcji. Z drugiej strony operator przypisania jest wywoływany tylko wtedy, gdy obiekt jest przypisany do innego obiektu.
  4. Gdy obiekt jest inicjowany za pomocą konstruktora kopiowania, obiekt inicjujący i zainicjowany obiekt współdzielą inne miejsce w pamięci. Z drugiej strony, gdy obiekt jest inicjowany za pomocą operatora przypisania, inicjalizowane i inicjujące obiekty mają tę samą lokalizację pamięci.
  5. Jeśli nie zdefiniujesz jawnie konstruktora kopiowania, wówczas kompilator go dostarczy. Z drugiej strony, jeśli nie zostanie przeciążony operator przypisania, wykonywana jest operacja kopiowania bitowego.

Wniosek:

Konstruktor Kopiuj jest najlepszy do kopiowania jednego obiektu do drugiego, gdy obiekt zawiera surowe wskaźniki.

Top