Sdílet prostřednictvím


Explicitní inicializace

Jazyk C++ podporuje dvě formy explicitní inicializace.

  • Poskytnutí seznamu inicializátorů v závorkách:

    String sFileName( "FILE.DAT" );
    

    Položky v seznamu v závorkách jsou považovány za argumenty konstruktoru třídy.Tato forma inicializace umožňuje inicializaci objektu s více než jednou hodnotou a lze ji také použít ve spojení s operátorem new.Příklad:

    Rect *pRect = new Rect( 10, 15, 24, 97 );
    
  • Zadání jednoho inicializátoru pomocí syntaxe inicializace znaménka rovnosti.Příklad:

    String sFileName = "FILE.DAT";
    

    Ačkoli předchozí příklad pracuje stejným způsobem jako příklad pro String v první položce seznamu, syntaxe není přizpůsobitelná pro použití s objekty, které jsou přiděleny na volném skladu.

    Výraz na pravé straně znaménka rovnosti se bere jako argument konstruktoru kopie třídy. Proto musí být typu, který lze převést na typ třídy.

    Všimněte si, že se znak rovnosti (=) v rámci inicializace liší od operátoru přiřazení. Přetížení operator= nemá žádný vliv na inicializaci.

Syntaxe inicializace znaménka rovnosti se liší od syntaxe stylu funkce, i když je ve většině případů generovaný kód totožný.Rozdíl je v tom, že se při použití syntaxe znaménka rovnosti musí kompilátor chovat, jako kdyby byla na řadě následující posloupnost událostí:

  • Vytváření dočasného objektu stejného typu jako je objekt, který je inicializován.

  • Kopírování dočasného objektu do objektu.

Před tím, než kompilátor může tyto kroky provést, musí být přístupný konstruktor.I v případě, že může kompilátor ve většině případů odstranit dočasné kroky vytváření a kopírování, způsobí nepřístupný konstruktor kopie, že inicializace znaménka rovnosti selže (pod /Za, /Ze (zakázat rozšíření jazyka)).Příklad:

// spec1_explicit_initialization.cpp
// compile with: /Za
class anInt {
   anInt( const anInt &copy ) {}   // private copy constructor

public:
   anInt( int ) {}   // public constructor
};

int main() {
   // Access-control violation. 
   // Attempt to reference private copy constructor.
   anInt myInt = 7;   // C2248

   anInt myInt2(7);   // Correct; no copy constructor called.
}

Při volání funkce jsou argumenty typu třídy, které jsou předány na základě hodnot a objektů vrácených podle hodnoty, koncepčně inicializovány pomocí formuláře:

název typunázev = hodnota

Příklad:

String s = "C++";

Z toho vyplývá, že typ argumentu musí být typ, který lze převést na typ třídy, který je předán jako argument.Konstruktor kopie třídy, stejně jako uživatelem definovaný převod operátorů nebo konstruktorů, které přijímají typ daného argumentu, musí být veřejný.

Ve výrazech, které používají operátor new, jsou objekty přidělené na volném skladu koncepčně inicializovány pomocí formuláře:

název typunázev**(**inicializátor1, inicializátor2, ...Inicializátorn )

Příklad:

String *ps = new String( "C++" );

Inicializátory pro komponenty základních tříd a objektů členů třídy jsou také koncepčně inicializovány tímto způsobem. (Další informace naleznete v tématu Inicializace základních tříd a členů.)

Viz také

Referenční dokumentace

Inicializace pomocí speciálních členských funkcí