Udostępnij za pośrednictwem


Memberwise przydziału i inicjalizacja

Metody przydział domyślny i inicjowania są odpowiednio "przydziału memberwise" i "inicjowania memberwise".Memberwise przydziału składa się kopiowania jednego obiektu do innego, członka w czasie, tak, jakby indywidualnie przypisanie każdego członka.Inicjowania memberwise składa się z Kopiowanie jednego obiektu do innego, członka w czasie, tak, jakby inicjowanie indywidualnie każdego członka.Podstawowa różnica między tymi dwoma jest, że przypisanie memberwise wywołuje każdego członka operatorem przypisania (operator=), natomiast memberwise inicjowania wywołuje Konstruktor kopiujący każdego członka.

Memberwise przydziału jest wykonywane tylko przez operatora przypisania zgłoszone w formie:

type**&** type :: operator=( [const | volatile] type**&** )

Nie można wygenerować domyślne operatory przypisania dla przydziału memberwise, jeśli występuje którykolwiek z następujących warunków:

  • Klasa Członkowskich ma const członków.

  • Klasa Członkowskich posiada członkowie odwołania.

  • Klasy Członkowskie lub jego podstawowej ma operator przypisania prywatnego (operator=).

  • Klasy podstawowej lub Członkowskich ma żaden operator przypisania (operator=).

Nie można wygenerować konstruktory Kopiuj domyślne dla inicjowania memberwise, jeśli klasy lub jednej z jej klas podstawowych ma konstruktora prywatnej kopii lub jeśli występuje którykolwiek z następujących warunków:

  • Klasa Członkowskich ma const członków.

  • Klasa Członkowskich posiada członkowie odwołania.

  • Klasy Członkowskie lub jego podstawowej ma konstruktora prywatnej kopii.

  • Klasy podstawowej lub Członkowskich ma konstruktora nie kopiowania.

Zgłaszane są zawsze domyślne operatory przypisania i konstruktory kopia dla danej klasy, ale nie są zdefiniowane, chyba że spełnione są oba następujące warunki:

  • Klasa nie udostępnia funkcji zdefiniowanej przez użytkownika dla tej kopii.

  • Program wymaga, że funkcja być obecny.Wymaganie to istnieje, jeśli przypisania lub inicjowania okaże się, że wymaga, memberwise, kopiowanie lub adres tej klasy operator= funkcja jest pobierana.

Jeśli obydwa warunki nie są spełnione, kompilator nie jest wymagane do generowania kodu domyślny operator przypisania i skopiować funkcji konstruktora (zniesienie takiego kodu jest optymalizacja wykonywane przez kompilator Microsoft C++).W szczególności jeżeli klasy deklaruje przez użytkownika operator= który przyjmuje argument typu "odniesienie do Nazwa klasy," jest generowany żaden operator przydział domyślny.Jeśli klasy deklaruje konstruktora kopii, generowany jest Brak domyślnego konstruktora kopii.

W związku z tym, dla danej klasy A, zawsze występują następujące deklaracje:

//  Implicit declarations of copy constructor
//   and assignment operator.
A::A( const A& );
A& A::operator=( const A& );

Definicje są dostarczane tylko wtedy, gdy jest to wymagane (zgodnie z poprzednim kryteriów).W poprzednim przykładzie funkcji konstruktora kopii są traktowane jako funkcje publicznego członka klasy.

Operatory przypisania domyślne umożliwiają obiektów danej klasy ma być przypisany do obiektów publicznych typu klasa bazowa.Rozważmy następujący kod:

Przykład

// spec1_memberwise_assignment_and_initialization.cpp

#include<stdio.h>

class Account
{
protected:
    int _balance;
public:
   int getBalance() 
   {
      return _balance;
   }
};

class Checking : public Account
{
private:
    int _fOverdraftProtect;
public:
    Checking(int balance, int fOverdraftProtect)
    {
        _balance = balance;
        _fOverdraftProtect = fOverdraftProtect;
    }
};

int main()
{
    Account account;
    Checking checking(1000, 1);
    account = checking;
    printf_s("Account balance = %d\n", account.getBalance());
}
  

Komentarz

W poprzednim przykładzie jest operatorem przypisania wybranego Account::operator=.Ponieważ domyślnie operator= funkcja przyjmuje argument typu Account& (odniesienie do Account), Account podobiektów z checking jest kopiowany do account; fOverdraftProtectnie jest kopiowane.

Zobacz też

Informacje

Kopiowanie obiektów klasy