Partilhar via


Memberwise de inicialização e de atribuição

Os métodos de atribuição padrão e inicialização são "memberwise assignment" e "inicialização de memberwise", respectivamente.Atribuição de memberwise consiste em copiar um objeto para outro, um membro de cada vez, como se atribuir a cada membro individualmente.Memberwise inicialização consiste em copiar um objeto para outro, um membro de cada vez, como se inicializar cada membro individualmente.A principal diferença entre os dois é que a atribuição de memberwise invoca o operador de atribuição de cada membro (operator=), enquanto memberwise inicialização chama o construtor de cópia de cada membro.

Atribuição de memberwise é realizada somente pelo operador de atribuição declarado no formulário:

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

Operadores de atribuição padrão para atribuição de memberwise não podem ser geradas se qualquer uma das seguintes condições existir:

  • Uma classe de membro tem const membros.

  • Uma classe de membro tem membros de referência.

  • Uma classe de membro ou de sua classe base tem um operador de atribuição particular (operator=).

  • Uma classe de membro ou uma classe base não tem nenhum operador de atribuição (operator=).

Construtores de cópia do padrão para a inicialização do memberwise não não possível gerar a classe ou uma de suas classes base possui um construtor de cópia particular ou se qualquer uma das seguintes condições existirem:

  • Uma classe de membro tem const membros.

  • Uma classe de membro tem membros de referência.

  • Uma classe de membro ou de sua classe base tem um construtor de cópia privada.

  • Uma classe de membro ou uma classe base não tem nenhum construtor de cópia.

Os operadores de atribuição padrão e os construtores de cópia para uma determinada classe sempre são declarados, mas não estão definidos, a menos que as seguintes condições forem atendidas:

  • A classe não fornece uma função definida pelo usuário para esta cópia.

  • O programa requer que a função esteja presente.Essa exigência ocorre se uma atribuição ou inicialização é encontrada que requer a cópia de memberwise ou se o endereço da classe operator= função é tirada.

Se as duas condições não forem atendidas, o compilador não é necessário para gerar o código para o operador de atribuição padrão e copiar as funções de construtor (eliminação de tal código é uma otimização realizada pelo compilador Microsoft C++).Especificamente, se a classe declara um user-defined operator= que leva um argumento do tipo "de referência para nome da classe," Nenhum operador de atribuição padrão é gerado.Se a classe declara um construtor de cópia, não é gerado nenhum construtor de cópia padrão.

Portanto, para uma determinada classe A, as seguintes declarações estão sempre presentes:

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

As definições são fornecidas apenas se necessário (de acordo com os critérios anteriores).As funções do construtor de cópia mostradas no exemplo anterior são consideradas funções de membro público da classe.

Os operadores de atribuição padrão permite que os objetos de uma determinada classe a ser atribuído a objetos de um tipo de classe base público.Considere o código a seguir:

Exemplo

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

Comment

No exemplo anterior, o operador de atribuição escolhido é Account::operator=.Porque o padrão operator= função leva um argumento do tipo Account& (referência a Account), o Account objetos filho específicos de checking é copiado para account; fOverdraftProtectnão é copiado.

Consulte também

Referência

Copiar objetos de classe