Sdílet prostřednictvím


Memberwise přiřazení a inicializace

Metody pro přiřazení výchozí a inicializaci jsou "memberwise inicializace," a "memberwise přiřazení".Memberwise přiřazení obsahuje kopírování jednoho objektu na druhý člen současně, jako by jednotlivě přiřazení jednotlivých členů.Memberwise inicializační tvoří kopírování jednoho objektu na druhý člen současně, jako by jednotlivě inicializaci každého člena.Základní rozdíl mezi těmito dvěma je, že memberwise přiřazení vyvolá každý člen operátor přiřazení (operator=) k tomu, že memberwise inicializace vyvolá konstruktor kopie každého člena.

Memberwise přiřazení provádí pouze operátor přiřazení deklarován ve formuláři:

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

Operátory přiřazení výchozí memberwise přiřazení nelze generovat, pokud některá z následujících podmínek:

  • Třída člen má const členů.

  • Člen třídy má odkaz členů.

  • Člen třídy nebo její základní třídě má soukromý operátoru (operator=).

  • Základní třídu nebo třídy člen nemá žádný operátor přiřazení (operator=).

Výchozí konstruktory kopie memberwise inicializaci nelze generovat, pokud soukromé Kopírovat konstruktor třídy nebo některý z jeho základních tříd nebo pokud některá z následujících podmínek:

  • Třída člen má const členů.

  • Člen třídy má odkaz členů.

  • Člen třídy nebo její základní třídě má soukromý Kopírovat konstruktor.

  • Základní třídu nebo třídy členské nemá žádné Kopírovat konstruktor.

Operátory přiřazení výchozí a kopie konstruktory pro danou třídu vždy deklarována, ale nejsou definovány Pokud jsou splněny obě následující podmínky:

  • Třída neposkytuje pro tuto kopii uživatelem definované funkce.

  • Program vyžaduje, aby byly přítomny funkce.Tento požadavek existuje v případě přiřazení nebo inicializace vyžadující memberwise kopírování nebo pokud adresu třídy operator= funkce je přijata.

Pokud nejsou splněny obě tyto podmínky, kompilátor nemusí generovat kód pro výchozí operátor přiřazení a kopírovat funkce konstruktoru (eliminace takový kód je optimalizace provádí kompilátor Microsoft C++).Konkrétně Pokud třída prohlašuje uživatelem definované operator= , která má argument typu "odkaz na název třídy," je generován žádný výchozí operátor přiřazení.Pokud třída prohlašuje Kopírovat konstruktor, vygeneruje se kopírovat výchozí konstruktor.

Proto pro danou třídu A, jsou vždy k dispozici následující prohlášení:

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

Definice jsou k dispozici pouze v případě, že požadované (podle předchozí kritéria).Funkce konstruktoru kopírování v předchozím příkladu jsou považovány za veřejná členské funkce třídy.

Operátory přiřazení výchozí povolit objekty dané třídy přiřadit objekty typu veřejné základní třída.Zvažte následující kód:

Příklad

// 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 (Komentář)

V předchozím příkladu je operátor přiřazení zvolili Account::operator=.Protože výchozí operator= funkce má argument typu Account& (odkaz na Account), Account určitých podřízených objektů z checking je zkopírován do account; fOverdraftProtectnení kopírován.

Viz také

Referenční dokumentace

Kopírování objektů třídy