Inicializace objektů, kterým je přiřazen výraz new.
Součástí gramatiky operátoru new je volitelné pole inicializátoru.To umožňuje nové objekty inicializovat konstruktory definovanými uživatelem.Další informace o průběhu inicializace naleznete v tématu Inicializátory.Následující příklad ukazuje, jak použít výraz inicializace s operátorem 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 );
// ...
}
V tomto příkladu je objektu CheckingAcct pomocí operátoru new přidělena paměť, ale není zadána žádná výchozí inicializace.Proto je zavolán výchozí konstruktor třídy Acct().Poté je objektu SavingsAcct paměť přidělena stejným způsobem s tím rozdílem, že je explicitně inicializován na hodnotu 34.98.Vzhledem k tomu, že je hodnota 34.98 typu double, je zavolán konstruktor, který přijímá argument tohoto typu a provede inicializaci.Nakonec je netřídní typ HowMuch inicializován na hodnotu 43.0.
Pokud je objekt typu třídy a tato třída má konstruktory (jako v předchozím příkladu), lze objekt inicializovat pomocí operátoru new, pouze pokud je splněna jedna z těchto podmínek:
Argumenty zadané v inicializátoru souhlasí s argumenty konstruktoru.
Třída má výchozí konstruktor (konstruktor, který lze volat bez argumentů).
Operátor operator new a konstruktory provádějí řízení přístupu a řízení nejednoznačnosti podle pravidel uvedených v tématech Nejednoznačnost a Inicializace pomocí speciálních členských funkcí.
Při přidělování paměti polím nelze pomocí operátoru new provést žádné explicitní inicializace prvků. Je-li přítomen, je zavolán pouze výchozí konstruktor.Další informace naleznete v tématu Výchozí argumenty.
Pokud dojde k selhání přidělení paměti (operator new vrátí hodnotu 0), není inicializace provedena.Je to ochrana proti pokusům o inicializaci neexistujících dat.
Stejně jako u volání funkcí není definováno pořadí, ve kterém jsou inicializované výrazy vyhodnoceny.Kromě toho byste se neměli spoléhat, že jsou před provedením přidělení paměti tyto výrazy zcela vyhodnoceny.Pokud dojde k chybě přidělení paměti a operátor new vrátí hodnotu 0, nemusí být některé výrazy v inicializátoru zcela vyhodnoceny.