Sdílet prostřednictvím


Inicializace odkazů

Proměnné typu odkazu je nutné inicializovat objektem typu, ze kterého je typ odkazu odvozen nebo objektem typu, který lze převést na typ, ze kterého je odvozen typ odkazu.Příklad:

// initializing_references.cpp
int iVar;
long lVar;
int main() {
   long& LongRef1 = lVar;   // No conversion required.
   long& LongRef2 = iVar;   // C2440
   const long& LongRef3 = iVar;   // OK
   LongRef1 = 23L;   // Change lVar through a reference.
   LongRef2 = 11L;   // Change iVar through a reference.
   LongRef3 = 11L;   // C3892
}

Jediný způsob, jak inicializovat odkaz na dočasný objekt je inicializovat objekt dočasné konstanty.Po inicializaci bude proměnná typu odkazu vždy odkazovat na stejný objekt. Nelze jej změnit pro odkazování na jiný objekt.

Přestože je syntaxe stejná, inicializace proměnných typu odkazu a přiřazení proměnné referenčního typu jsou sémanticky rozdílné.V předchozím příkladu se přiřazení, která mění iVar a lVar jeví inicializacím totožně, ale mají různé účinky.Inicializace určuje objekt, na který odkazuje proměnná typu odkazu. Přiřazení se přiřadí prostřednictvím odkazu na odkazovaný objekt.

Protože předání argumentu typu odkazu na funkci a návratová hodnota typu odkazu funkce inicializace, jsou formální argumenty funkce inicializovány správně, stejně jako vrácené odkazy.

Proměnné typu odkazu mohou být deklarovány bez použití inicializátorů pouze v následujících případech:

  • Deklarace funkce (prototypy).Příklad:

    int func( int& );
    
  • Deklarace návratového typu funkce.Příklad:

    int& func( int& );
    
  • Deklarace člena třídy typu odkazu.Příklad:

    class c {
    public:
       int& i;
    };
    
  • Deklarace proměnné explicitně zadané jako extern.Příklad:

    extern int& iVal;
    

Při inicializaci proměnné typu odkazu, používá kompilátor graf rozhodnutí zobrazený na následujícím obrázku, pro výběr mezi vytvořením odkazu na objekt nebo vytvořením dočasného objektu, na který odkaz směřuje.

Graf rozhodnutí inicializace typů odkazů

Graf rozhodnutí pro inicializaci typů odkaz

Odkazy na typy volatile (deklarované jako volatiletypename**&identifikátor) mohou být inicializovány pomocí objektů volatile stejného typu nebo objekty, které nejsou deklarovány jako volatile.Nelze je však inicializovat pomocí objektů const tohoto typu.Podobně, odkazy na typy const (deklarované jako consttypename&**identifikátor) mohou být inicializovány pomocí objektů const stejného typu (nebo čímkoli, kde existuje převod na daný typ nebo pomocí objektů, které nejsou deklarovány jako const).Nelze je však inicializovat pomocí objektů volatile tohoto typu.

Odkazy, které nejsou kvalifikovány buď pomocí const nebo klíčovým slovem volatile, lze inicializovat pouze objekty deklarovanými jako const nebo volatile.

Viz také

Referenční dokumentace

Inicializátory