Initialisieren von mit "new" zugeordneten Objekten
Ein optionales Feld Initialisierer ist in der Grammatik für den new-Operator enthalten. Dadurch können neue Objekte mit benutzerdefinierten Konstruktoren initialisiert werden. Weitere Informationen darüber, wie die Initialisierung durchgeführt wird, finden Sie unter Initialisierer. Das folgende Beispiel veranschaulicht, wie Sie einen Initialisierungsausdruck mit dem new-Operator verwenden:
// expre_Initializing_Objects_Allocated_with_new.cpp
class Acct
{
public:
// Define default constructor and a constructor that accepts
// an initial balance.
Acct() { balance = 0.0; }
Acct( double init_balance ) { balance = init_balance; }
private:
double balance;
};
int main()
{
Acct *CheckingAcct = new Acct;
Acct *SavingsAcct = new Acct ( 34.98 );
double *HowMuch = new double ( 43.0 );
// ...
}
In diesem Beispiel wird das Objekt CheckingAcct mithilfe des Operators new zugeordnet, aber es wird keine Standardinitialisierung angegeben. Deshalb wird der Standardkonstruktor für die Acct()-Klasse aufgerufen. Anschließend wird das Objekt SavingsAcct auf die gleiche Weise zugeordnet, mit der Ausnahme, dass es explizit mit 34,98 initialisiert wird. Da 34.98 den Typ double aufweist, wird der Konstruktor, der ein Argument dieses Typs akzeptiert, aufgerufen, um die Initialisierung zu bearbeiten. Schließlich wird der Nichtklassentyp HowMuch mit 43,0 initialisiert.
Wenn ein Objekt einen Klassentyp besitzt und diese Klasse Konstruktoren (wie im vorhergehenden Beispiel) enthält, kann das Objekt nur dann mit dem new-Operator initialisiert werden, wenn eine dieser Bedingungen erfüllt ist:
Die Argumente, die im Initialisierer bereitgestellt werden, stimmen mit denen eines Konstruktors überein.
Die Klasse verfügt über einen Standardkonstruktor (einen Konstruktor, der ohne Argumente aufgerufen werden kann).
Zugriffssteuerung und Mehrdeutigkeitssteuerung werden auf operator new und auf den Konstruktoren nach den Regeln ausgeführt, die in Mehrdeutigkeit und Initialisierung mit speziellen Memberfunktionen festgelegt sind.
Es kann keine explizite Initialisierung pro Element erfolgen, wenn Arrays mithilfe des new-Operators zuordnet werden. Nur der Standardkonstruktor wird aufgerufen, wenn er vorhanden ist. Weitere Informationen finden Sie unter Standardargumente.
Wenn die Speicherbelegung fehlschlägt (operator new gibt den Wert 0 (null) zurück), wird keine Initialisierung ausgeführt. Dies schützt vor Versuchen, Daten zu initialisieren, die nicht vorhanden sind.
Wie bei Funktionsaufrufen ist auch bei initialisierten Ausdrücken die Reihenfolge der Auswertung nicht festgelegt. Darüber hinaus sollten Sie sich nicht darauf verlassen, dass diese Ausdrücke vollständig ausgewertet werden, bevor die Speicherbelegung ausgeführt wird. Wenn die Speicherbelegung fehlschlägt und der new-Operator 0 (null) zurückgibt, werden einige Ausdrücke im Initialisierer möglicherweise nicht vollständig ausgewertet.