Memberspezifische Zuweisung und Initialisierung
Die Methoden für die Zuordnung und Initialisierung sind „memberspezifische Zuweisung“ und „memberspezifische Initialisierung“.Memberwise-Zuweisung besteht, ein Objekt zum anderen, einen Member auf einmal zu kopieren, als wäre, Zuweisen von einzeln jeden Member.Memberwise-Initialisierung besteht, ein Objekt zum anderen, einen Member auf einmal zu kopieren, als wäre, Initialisieren einzeln jeden Member.Der primäre Unterschied zwischen beiden ist, dass memberspezifische Zuweisung Zuweisungsoperator jedes Members (operator=) aufruft, während memberspezifische Kopierkonstruktor Initialisierung der einzelnen Member aufruft.
Memberwise-Zuweisung wird nur vom Zuweisungsoperator ausgeführt, der in der Form deklariert wurde:
type**&** type :: (operator= [const | type**&** **)**volatile]
Zuweisungsoperatoren Standard für memberspezifische Zuweisung können nicht, wenn eine der folgenden Bedingungen generiert wurden, vorhanden sein:
Eine Memberklasse hat const-Member.
Eine Memberklasse Member Verweise verfügt.
Eine Memberklasse oder ihre Basisklasse verfügt über einen privaten Zuweisungsoperator (operator=).
Eine Basisklasse oder eine Memberklasse hat keinen Zuweisungsoperator (operator=).
Kopierkonstruktoren Standard für memberspezifische Initialisierung können nicht generiert werden, wenn die Klasse oder seiner Basisklassen einen privaten Kopierkonstruktor verfügt oder wenn eine der folgenden Bedingungen vorliegen:
Eine Memberklasse hat const-Member.
Eine Memberklasse Member Verweise verfügt.
Eine Memberklasse oder ihre Basisklasse verfügt über einen privaten Kopierkonstruktor.
Eine Basisklasse oder eine Memberklasse hat keinen Kopierkonstruktor.
Die standardmäßige Zuweisungsoperatoren und Kopierkonstruktoren für eine bestimmte Klasse immer deklariert werden, werden jedoch nicht definiert, sofern die beiden folgenden Bedingungen erfüllt sind:
Die Klasse stellt eine benutzerdefinierte Funktion für diese Kopie bereit.
Das Programm muss die Funktion vorhanden ist.Diese Anforderung ist vorhanden, wenn eine Zuweisung oder eine Initialisierung auftritt, die das kopierende memberspezifische erfordert oder wenn die Adresse der operator=-Funktion der Klasse belegt wird.
Wenn beide Bedingungen nicht erfüllt sind, ist der Compiler nicht erforderlich, um Code für die standardmäßige Zuweisungsoperator- Kopierkonstruktor und Funktionen zur Beseitigung solcher Code zu generieren (ist eine Optimierung, die vom Microsoft C++-Compiler ausgeführt wird).Insbesondere wenn die Klasse ein benutzerdefiniertes operator= deklariert, die ein Argument vom Typ „Verweis auf den Klassennamenakzeptiert,“ ist kein standardmäßige Zuweisungsoperator generiert.Wenn die Klasse über einen Kopierkonstruktor deklariert, wird kein Standardkopierkonstruktor generiert.
Aus diesem Grund für eine bestimmte Klasse die folgenden Deklarationen A, sind immer vorhanden:
// Implicit declarations of copy constructor
// and assignment operator.
A::A( const A& );
A& A::operator=( const A& );
Die Definitionen werden nur bei Bedarf entsprechend den oben genannten Kriterien angegeben ().Die Kopierkonstruktor, die im vorherigen Beispiel gezeigt werden, gelten als Funktionen des öffentlichen Member der Klasse.
standardmäßigen Zuweisungsoperatoren können Objekte einer bestimmten Objekten eines Typs Basisklasse öffentliche Klasse zugewiesen werden soll.Betrachten Sie folgenden Code:
Beispiel
// 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());
}
Kommentar
Im vorherigen Beispiel ist der ausgewählte Zuweisungsoperator Account::operator=.Da die standardmäßige operator=-Funktion ein Argument des Typs Account& (Verweis auf Account) verwendet, wird das Account Unterobjekt von checking zu accountkopiert. fOverdraftProtect werden nicht kopiert.