Nie rozumiem różnicy między konstruktorem przypisania a konstruktorem kopiującym w C ++. To wygląda tak:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
Chcę wiedzieć, jak przydzielić pamięć konstruktora przypisania i konstruktora kopiującego?
Odpowiedzi:
Konstruktor kopiujący służy do zainicjowania wcześniej niezainicjowanego obiektu z danych innego obiektu.
Na przykład:
Operatorowi przypisanie jest stosowany do zastąpienia danych o uprzednio inicjowane obiektu z innym obiektem danych użytkownika.
Na przykład:
Możesz zastąpić konstrukcję kopiowania domyślną konstrukcją plus przypisanie, ale byłoby to mniej wydajne.
(Na marginesie: moje implementacje powyżej są dokładnie tymi, które kompilator przyznaje ci za darmo, więc nie ma sensu ich implementować ręcznie. Jeśli masz jedną z tych dwóch, prawdopodobnie ręcznie zarządzasz jakimś zasobem. W takim przypadku, zgodnie z Regułą trzech , najprawdopodobniej będziesz potrzebować drugiego plus destruktora).
źródło
=default;
.= default
ich używać tam, gdzie potrzebny jest domyślny ctor: po prostu zaimplementowanie pustego ciała przez nas nadal liczy się jako zdefiniowany przez użytkownika, a zatem (na poziomie Standardese ) nie jest trywialny i dyskwalifikuje typ z klasyfikacji, które wymagają trywialnego ktora.:)
Spróbujesz jeszcze raz wyjaśnić, o czym mówisz?Różnica między konstruktorem kopiującym a operatorem przypisania powoduje wiele zamieszania dla nowych programistów, ale nie jest to wcale takie trudne. Zreasumowanie:
Przykład operatora przypisania:
Przykład konstruktora kopiującego:
źródło
vector <A> v3
i wtedyv3 = v2
(gdziev2
jest poprzednio zadeklarowany i zawierający elementyvector<A>
) wywołuje mój jawnyA
konstruktor kopiujący zamiastoperator=
? Spodziewałemoperator=
się, że zadzwonię zamiast tego,copy constructor
ponieważ mójv3
obiekt był już zadeklarowany w momencie, w którym wykonałem zadaniePierwsza to inicjalizacja kopiowania, druga to tylko przypisanie. Nie ma czegoś takiego jak konstruktor przypisania.
używa generowanego przez kompilator konstruktora kopiującego.
używa domyślnego konstruktora do konstruowania
cc
, a następnie * operatora przypisania ** (operator =
) na już istniejącym obiekcie.IDK, co masz na myśli, mówiąc w tym przypadku o przydzieleniu pamięci, ale jeśli chcesz zobaczyć, co się stanie, możesz:
Polecam również przyjrzeć się:
Dlaczego zamiast konstruktora konwersji wywoływany jest konstruktor kopiujący?
Jaka jest zasada trzech?
źródło
W prostych słowach
Konstruktor kopiujący jest wywoływany, gdy nowy obiekt jest tworzony z istniejącego obiektu, jako kopia istniejącego obiektu. Operator przypisania jest wywoływany, gdy do już zainicjowanego obiektu jest przypisywana nowa wartość z innego istniejącego obiektu.
Przykład-
źródło
To, co powiedział @Luchian Grigore, jest zaimplementowane w ten sposób
WYNIK
domyślny konstruktor
konstruktor kopiujący
domyślny konstruktor
operator przypisania
źródło
różnica między konstruktorem kopiującym a konstruktorem przypisania jest następująca:
<classname> <o1>=<o2>
)<o1>=<o2>
).A podstawowe funkcje w obu są takie same, będą kopiować dane z o2 do o1 member-by-member.
źródło
Chcę dodać jeszcze jedną kwestię na ten temat. „Funkcja operatora przypisania powinna być zapisywana tylko jako funkcja składowa klasy”. Nie możemy sprawić, że będzie działał jako przyjaciel, w przeciwieństwie do innych operatorów binarnych lub jednoargumentowych.
źródło
Coś do dodania o konstruktorze kopiującym:
Podczas przekazywania obiektu przez wartość użyje konstruktora kopiującego
Kiedy obiekt jest zwracany z funkcji przez wartość, użyje konstruktora kopiującego
Podczas inicjalizacji obiektu przy użyciu wartości innego obiektu (jak podano w przykładzie).
źródło