Partager via


Assignation et initialisation de Memberwise

Les méthodes pour l'assignation par défaut et l'initialisation sont « peut-être membre à membre » et « initialisation membre à membre, » respectivement.L'assignation membre à membre se compose copier un objet à l'autre, un membre à la fois, comme si assignant chaque membre individuellement.L'initialisation membre à membre se compose copier un objet à l'autre, un membre à la fois, comme si vous initialisez chaque membre individuellement.La principale différence entre les deux est que l'assignation membre à membre appelle l'opérateur d'assignation de chaque membre (operator=), alors que l'initialisation membre à membre appelle le constructeur de copie de chaque membre.

L'assignation membre à membre est exécuté uniquement par l'opérateur d'assignation déclaré comme suit :

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

Les opérateurs d'assignation par défaut pour l'assignation membre à membre ne peut être généré si l'une des conditions suivantes existent :

  • une classe membre a des membres de const .

  • une classe membre a des membres de référence.

  • une classe membre ou sa classe de base a un opérateur d'assignation privé (operator=).

  • une classe de base ou une classe de membre n'a aucun opérateur d'assignation (operator=).

Les constructeurs de copie par défaut pour l'initialisation membre à membre ne peut être généré si la classe ou l'une de ses classes de base a un constructeur de copie privé ou si l'une des conditions suivantes existent :

  • une classe membre a des membres de const .

  • une classe membre a des membres de référence.

  • une classe membre ou sa classe de base a un constructeur de copie privé.

  • Une classe de base ou une classe de membre n'a pas de constructeur de copie.

Les opérateurs et les constructeurs de copie d'assignation par défaut pour une classe donnée sont toujours déclarés, mais ils ne sont pas définis à moins que les deux conditions suivantes sont remplies :

  • la classe ne fournit pas une fonction définie par l'utilisateur pour cette copie.

  • Le programme requiert que la fonction est présente.Cette spécification existe si une assignation ou une initialisation est produit qui requièrent la copie membre à membre ou si l'adresse de la fonction d' operator= de la classe est prise.

Si les deux conditions ne sont pas respectées, le compilateur n'est pas requis pour générer le code pour l'opérateur d'assignation par défaut et un constructeur de copie s'exécute (l'élimination de code correspondant est une optimisation exécutée par le compilateur Microsoft C++).Plus particulièrement, si la classe déclare operator= défini par l'utilisateur qui prend un argument de type « référence au nom de la classe, » aucun opérateur d'assignation par défaut n'est généré.si la classe déclare un constructeur de copie, aucun constructeur de copie par défaut n'est généré.

par conséquent, pour une classe donnée A, les déclarations suivantes sont toujours présentes :

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

Les définitions sont disponibles uniquement si nécessaire (en fonction de les critères précédents).Les fonctions de constructeur de copie indiqué dans l'exemple précédent sont considérées comme des fonctions membres publiques de la classe.

Les opérateurs d'assignation par défaut permettent aux objets d'une classe donnée à assigner aux objets d'un type public de la classe de base.Prenons le code suivant :

Exemple

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

Commentaire

dans l'exemple précédent, l'opérateur d'assignation choisi est Account::operator=.Étant donné que la fonction d' operator= par défaut prend un argument de type Account& (référence à Account), le sous-objet d' Account d' checking est copié dans account; fOverdraftProtect n'est pas copié.

Voir aussi

Référence

Objets de classe de copie