Inicjowanie obiektów przydzielonych za pomocą instrukcji new
Opcjonalne pole Inicjator jest zawarte w gramatyce dla operatora Nowy.Dzięki temu nowe obiekty mają zostać zainicjowane z konstruktorów zdefiniowanych przez użytkownika.Aby uzyskać więcej informacji dotyczących sposobu inicjalizacji, zobacz inicjatory.Poniższy przykład ilustruje sposób użycia wyrażenia inicjowania operatorem new:
// 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 );
// ...
}
W tym przykładzie obiekt CheckingAcct jest przydzielany za pomocą operatora new, ale nie określono inicjowania domyślnego.W związku z tym, wywoływany jest domyślny konstruktor dla klasy Acct().Następnie obiekt SavingsAcct jest przydzielany ten sam sposób, chyba że wyraźnie jest zainicjowany na 34.98.Ponieważ 34.98 jest typu double, konstruktor, który wymaga argumentu tego typu wywoływany jest do zainicjowania obsługi.Wreszcie, typ nonclass HowMuch jest zainicjowany na 43,0.
Jeśli obiekt jest typu klasy i klasa ma konstruktory (tak jak w poprzednim przykładzie), obiekty mogą być zainicjowane przez operator new tylko wtedy, gdy jeden z tych warunków jest spełniony:
Argumenty dostarczone w inicjatorze zgadzają się z tymi z konstruktora.
Klasa ma domyślny konstruktor (konstruktor, który można wywołać bez argumentów).
Kontrola dostępu i kontrola niejednoznaczności są wykonywane na operator new i konstruktorach zgodnie z zasadami zawartym w niejednoznaczności i Inicjowanie przy użyciu specjalnych funkcji elementów członkowskich.
Żadna inicjacja elementu jawnego może odbywać się podczas przydzielania tablic przy użyciu operatora new; tylko konstruktor domyślny, jeśli jest obecny, jest nazywany.Aby uzyskać więcej informacji, zobacz Domyślne argumenty.
Jeśli alokacja pamięci nie powiedzie się (operator new zwraca wartość 0), inicjowanie nie jest wykonywane.Chroni to przed próbami zainicjować danych, które nie istnieją.
Podobnie jak w przypadku wywołania funkcji kolejność szacowania zainicjowanego wyrażenia nie jest zdefiniowana.Ponadto nie należy polegać na tych wyrażeniach całkowicie ocenianych przed wykonaniem alokacji pamięci.Jeśli alokacja pamięci nie powiedzie się i operator new zwraca zero, niektóre wyrażenia w inicjatorze mogą nie być całkowicie oceniane.