Udostępnij za pośrednictwem


Inicjowanie odwołań

Zmienne typu referencyjnego muszą być zainicjowane z obiektem typu, który dziedziczy ten typ referencyjny, lub obiektu typu, który może zostać przekonwertowany na typ, z którego dziedziczy typ referencyjny.Na przykład:

// 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
}

Jedynym sposobem, aby zainicjować odwołanie tymczasowego obiektu, jest zainicjowanie stałej tymczasowej obiektu.Po zainicjowaniu, zmienna typu odwołania zawsze wskazuje ten sam obiekt; nie można zmodyfikować odwołania do innego obiektu.

Mimo że składnia może być taka sama, inicjowanie zmiennych typu odwołania i przypisanie do zmiennych typu odwołania są semantycznie różne.W poprzednim przykładzie, przydziały, które zmieniają iVar i lVar wyglądają podobnie do inicjalizacji, ale mają różne efekty.Inicjowanie określa obiekt, na które wskazuje zmienna typu odwołania; przypisanie przypisuje do określonego obiektu poprzez odniesienie.

Ponieważ, zarówno przekazywanie argumentu typu odwołania do funkcji i zwracanie wartości typu odwołania przez funkcję są inicjacjami, formalne argumenty do funkcji są zainicjowane poprawnie podczas zwracania odwołania.

Zmienna typu odwołania może być deklarowana bez inicjatorów, tylko w następujących przypadkach:

  • Deklaracja funkcji (prototypy).Na przykład:

    int func( int& );
    
  • Deklaracja typu funkcji zwracanej.Na przykład:

    int& func( int& );
    
  • Deklaracja elementu członkowskiego klasy typu odwołania.Na przykład:

    class c {
    public:
       int& i;
    };
    
  • Jawna deklaracja zmiennej określonej, jako extern.Na przykład:

    extern int& iVal;
    

Podczas inicjowania zmiennej typu odwołania, kompilator używa wykresu decyzji pokazanego na poniższym rysunku, aby wybrać między utworzeniem odwołania do obiektu a tymczasowym obiektem, który wskazuje odwołanie.

Wykres decyzji dla inicjowania typów referencyjnych

Wykres decyzji do zainicjowania typów odwołania

Odwołania do typów volatile (zadeklarowane, jako volatile typename**&** identifier) mogą być zainicjowane z obiektami volatile tego samego typu lub z obiektami, które nie zostały zadeklarowane jako volatile.Nie mogą one jednak być zainicjowane z obiektami const tego typu.Podobnie, odwołania do typów const (zadeklarowanych jako const typename**&** identyfikator), mogą być zainicjowane z obiektami const tego samego typu (lub cokolwiek, co ma konwersje typu lub z obiektami, które nie zostały zadeklarowane jako const).Nie mogą one jednak być zainicjowane z obiektami volatile tego typu.

Odwołania, które nie są kwalifikowane słowem kluczowym const lub volatile mogą być zainicjowane tylko z obiektami nie zadeklarowanymi, jako const i volatile.

Zobacz też

Informacje

Inicjatory