Udostępnij za pośrednictwem


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.

Zobacz też

Informacje

Specjalne funkcje członkowskie (C++)