Condividi tramite


Assegnazione membro per membro e inizializzazione

I metodi per assegnazione predefinita e l'inizializzazione sono rispettivamente “assegnazione membro per membro„ e “inizializzazione membro per membro,„.L'assegnazione membro per membro è costituito da copiare un oggetto in un altro, un membro alla volta, come se assegnando ciascun membro singolarmente.L'inizializzazione membro per membro è costituito da copiare un oggetto in un altro, un membro alla volta, come se reinizializzati ogni membro singolarmente.La differenza principale tra i due è che l'assegnazione membro per membro richiama l'operatore di assegnazione di ogni membro (operator=), durante l'inizializzazione membro per membro viene richiamato il costruttore di copia di ogni membro.

L'assegnazione membro per membro viene eseguita solo dall'operatore di assegnazione dichiarato nel form:

tipo& tipo :: operator= ( [const | volatile] tipo& )

Gli operatori di assegnazione predefiniti per l'assegnazione membro per membro non possono essere generati se una qualsiasi delle condizioni seguenti sono:

  • Una classe del membro ha const membri.

  • Una classe del membro dispone di membri di riferimento.

  • Una classe di membro o la relativa classe base dispone di un operatore di assegnazione (privatooperator=).

  • Una classe di base o una classe del membro non ha un operatore di assegnazione (operator=).

I costruttori di copia predefiniti per l'inizializzazione membro per membro non possono essere generati se la classe o una delle relative classi base ha un costruttore di copia privato o se una qualsiasi delle condizioni seguenti sono:

  • Una classe del membro ha const membri.

  • Una classe del membro dispone di membri di riferimento.

  • Una classe di membro o la relativa classe di base ha un costruttore di copia privato.

  • Una classe di base o una classe del membro non ha un costruttore di copia.

Gli operatori di assegnazione e i costruttori di copia predefiniti per una determinata classe vengono dichiarati sempre, ma non sono definiti a meno che entrambe le condizioni seguenti siano soddisfatte:

  • La classe non fornisce una funzione definita dall'utente per questa copia.

  • il programma richiede che la funzione sia presente.Questo requisito se è presente un'assegnazione o un'inizializzazione viene rilevata che richiedono la copia membro per membro o se l'indirizzo della classe operator= la funzione viene selezionata.

Se queste condizioni non vengono soddisfatte, il compilatore non è necessario generare codice per le funzioni predefinite del costruttore di copia e dell'operatore di assegnazione (eliminazione di tale codice è un'ottimizzazione eseguita dal compilatore Microsoft C++).In particolare, se la classe dichiara un oggetto definito dall'utente operator= accetta un argomento di riferimento del tipo su “ nome della classe,„ alcun operatore di assegnazione predefinito viene generato.Se la classe dichiara un costruttore di copia, nessun costruttore di copia predefinito viene generato.

Di conseguenza, per una determinata classe A, le dichiarazioni seguenti sono sempre presenti:

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

Le definizioni vengono fornite solo su richiesta (in base ai criteri precedenti).Le funzioni di un costruttore di copia visualizzate nell'esempio precedente vengono considerate funzioni membro pubbliche della classe.

Gli operatori di assegnazione predefiniti consentono agli oggetti di una classe specificata da assegnare agli oggetti di un tipo pubblico della classe base.Si consideri il codice seguente:

Esempio

// 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());
}
  

Commento

Nell'esempio precedente, l'operatore di assegnazione scelto viene Account::operator=.Poiché l'impostazione predefinita operator= la funzione accetta un argomento di tipo Account& (riferimento a Account), Account sotto-oggetto di checking viene copiato a account; fOverdraftProtect non viene copiato.

Vedere anche

Riferimenti

Oggetti di classe di copia