Kopiowanie obiektów klas
Zarówno operacja przypisania, jak i operacja inicjowania, powodują kopiowanie obiektów.
Przypisanie: gdy wartość jednego obiektu jest przypisana do innego obiektu, pierwszy obiekt jest kopiowany do drugiego obiektu.Dlatego,
Point a, b; ... a = b;
powoduje, że wartość b zostaje skopiowana do a.
Inicjacja: inicjacja występuje, gdy deklarowany jest nowy obiekt, gdy argumenty są przekazywane do funkcji przez wartość lub gdy wartości są zwracane z funkcji przez wartość.
Można zdefiniować semantykę "kopii" dla obiektów typu klasy.Na przykład, rozważmy ten kod:
TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;
Powyższy kod może oznaczać "skopiuj zawartość FILE1.DAT do FILE2.DAT" lub może oznaczać "ignoruj FILE2.DAT i ustaw b jako drugi uchwyt dla FILE1.DAT. " Należy dołączyć do każdej klasy odpowiednie semantyki kopiowania , w następujący sposób.
Za pomocą operatora przypisania operator= wraz z odniesieniem do typu klasy jako zwracanego typu i parametrem, który jest przekazywany przez odwołanie const — na przykład ClassName& operator=(const ClassName& x);.
Za pomocą konstruktora kopii.Aby uzyskać więcej informacji dotyczących konstruktora kopii, zobacz Reguły deklarowania konstruktorów.
Jeśli konstruktor kopii nie zostanie zadeklarowany, kompilator wygeneruje konstruktor kopii member-wise. Jeśli operator przypisania nie zostanie zadeklarowany, kompilator wygeneruje operator przypisania member-wise.Deklarowanie konstruktora kopii nie ogranicza operatora przypisania kopii generowanego przez kompilator, ani na odwrót.Przy implementacji jednego z nich, zaleca się także zaimplementowanie drugiego tak, aby znaczenie kodu było jasne.
Przypisanie member-wise jest opisane bardziej szczegółowo w Przypisanie i inicjowanie elementów członkowskich.
Konstruktor kopii przyjmuje argument typu class-name**&**, gdzie class-name jest nazwą klasy, dla której zdefiniowano konstruktor.Na przykład:
// spec1_copying_class_objects.cpp
class Window
{
public:
Window( const Window& ); // Declare copy constructor.
// ...
};
int main()
{
}
[!UWAGA]
Należy tworzyć typ argumentu konstruktora kopii const class-name& zawsze, gdy jest to możliwe.Zapobiega to przypadkowym zmianom obiektu, z którego następuje kopiowanie przez konstruktor kopii.Umożliwia to również kopiowanie z obiektów const.