Sdílet prostřednictvím


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.

Viz také

Referenční dokumentace

new – operátor (C++)