Kopiowanie służy do inicjowania nowych obiektów poprzez kopiowanie zawartości już istniejących, przypisanie służy do nadpisywania istniejących obiektów zawartością innych obiektów - te dwie rzeczy są bardzo różne. W szczególności
SomeClass a;
SomeClass b = a;
jest kopia inicjalizacji - jesteś kopiowania a
aby utworzyć nowy SomeClass nazywa b
użyciem składni formularza
T x = y;
To ma wpływ na wywoływanie SomeClass
„s skopiować konstruktora (zakładając, że jest jeden i jest dostępny). Generowany przez kompilator domyślny konstruktor kopiowania wykonałby kopię zgodną z prawem: a
; w razie potrzeby można go zastąpić własnym, np.
SomeClass(const SomeClass& rhs)
: x(rhs.x)
{}
(Należy pamiętać, że jest to bardzo nudne przykład, jak to po prostu robi to, co domyślne memberwise skopiować konstruktora potęgę.)
Idąc dalej, to
SomeClass c(a);
jest bezpośredni inicjalizacji przy użyciu konstruktora kopii. Będzie to na ogół mają taki sam efekt jak wyżej, ale to jest warta odczytu:
http://www.gotw.ca/gotw/036.htm
Również zobaczyć tutaj:
http://www.gotw.ca/gotw/001.htm
końcowego sprawę, a mianowicie
b = c;
jest zadaniem. Semantyką tego powinno być na ogół nadpisanie b
z zawartością c
(chociaż niektóre rzeczy, takie jak std::auto_ptr
, mają dziwną semantykę przypisania, więc uważaj). Aby zaimplementować własną operatora przypisania, piszesz coś takiego (zauważ, że jest to bardzo nudne przykład, jak to po prostu robi to, co domyślny memberwise operator przypisania może):
SomeClass& operator=(const SomeClass& rhs)
{
x = rhs.x;
return *this;
}
W praktyce jednak trzeba uważaj na wyjątkowe bezpieczeństwo w sytuacjach takich jak ten, co prowadzi do takich rzeczy, jak popularny język do kopiowania i zamiany w celu implementacji operatorów przydziału. Zobacz tutaj:
http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap
co nazywasz „przypisanie” jest w rzeczywistości nazywa się „inicjalizacji”, a to, co nazywamy „kopiowanie” nazywany jest „zadanie”. – Philipp
'SomeClass a();' - To jest deklaracja funkcji. –
Możliwy duplikat: http://stackoverflow.com/questions/5368258/the-copy-constructor-and-assignment-operator –