Udostępnij za pośrednictwem


Zmiany w kolejności inicjowania konstruktorów

Kolejność inicjowania dla konstruktorów klas zmienił się z zarządzanych rozszerzeń języka C++ do Visual C++.

Porównanie kolejność inicjowania Konstruktor

W obszarze zarządzane rozszerzenia języka C++ Konstruktor inicjalizacji wystąpił w następującej kolejności:

  1. Konstruktor klasy podstawowej, jeśli w ogóle, jest wywoływany.

  2. Sprawdzana jest zgodność z listy inicjalizacji klasy.

  3. Treść kodu, konstruktora klasy jest wykonywany.

Ta kolejność wykonywania konwencjami sam jak native programowania C++.Nowy język Visual C++ określa kolejność wykonywania następujących klas CLR:

  1. Sprawdzana jest zgodność z listy inicjalizacji klasy.

  2. Konstruktor klasy podstawowej, jeśli w ogóle, jest wywoływany.

  3. Treść kodu, konstruktora klasy jest wykonywany.

Należy zauważyć, że ta zmiana dotyczy tylko klasy CLR; w trybie macierzystym klasy w Visual C++ nadal stosować poprzednich Konwencji.W obu przypadkach reguły te Kaskadowo w górę w całym łańcuchu całej hierarchii danej klasy.

Rozważmy następujący przykład kodu przy użyciu rozszerzenia zarządzane dla języka C++:

__gc class A
{
public:
   A() : _n(1)
   {
   }

protected:
   int _n;
};

__gc class B : public A
{
public:
   B() : _m(_n)
   {
   }
private:
   int _m;
};

Zlecenie inicjowania Konstruktor opisane powyżej, należy widzimy następującą kolejność wykonywania podczas nowego wystąpienia klasy B , wykonane są:

  1. Konstruktor klasy bazowej A jest wywoływana._n Członkowskich jest ustawiana na 1.

  2. Inicjalizacja listy dla klasy B jest oceniane._m Członkowskich jest ustawiana na 1.

  3. Treść kodu klasy B jest wykonywany.

Teraz należy wziąć pod uwagę ten sam kod w nowe elementy składni języka Visual C++:

ref class A
{
public:
   A() : _n(1)
   {
   }

protected:
   int _n;
};

ref class B : A
{
public:
   B() : _m(_n)
   {
   }
private:
   int _m;
};

Kolejność wykonywania podczas nowego wystąpienia klasy B są wykonane w ramach nowego składnia jest następująca:

  1. Inicjalizacja listy dla klasy B jest oceniane._m Członkowskich jest ustawiana na 0 (0 jest niezainicjowany wartość _m członek klasy).

  2. Konstruktor klasy bazowej A jest wywoływana._n Członkowskich jest ustawiana na 1.

  3. Treść kodu klasy B jest wykonywany.

Należy zauważyć, że podobne składni produkuje różne wyniki dla tych przykładów kodu.Konstruktor klasy B zależy od wartości z klasy bazowej A zainicjować jego elementów członkowskich.Jednakże konstruktora dla klasy A jeszcze nie została sfałszowana.Zależność ta może być szczególnie niebezpieczne, gdy dziedziczonej klasie zależy od alokację zasobów lub pamięci występuje w konstruktorze klasy podstawowej.

Co to oznacza począwszy od rozszerzenia zarządzane dla języka C++ do programu Visual C++ 2010

W wielu przypadkach zmiany kolejności wykonywania konstruktorów klas powinny być przejrzyste dla programisty, ponieważ klas podstawowych ma bez pojęcia zachowanie klasy dziedziczone.Jednakże ponieważ te przykłady kodu pokazują, Konstruktory klasy dziedziczone mogą zależeć podczas ich inicjowania listy zależą od wartości składników klasy podstawowej.Podczas przenoszenia kodu z rozszerzenia zarządzane dla języka C++ do nowej składni, lepiej wykonać przeniesienie takie konstrukcje do treści konstruktora klasy gdzie gwarantuje wykonanie występować jako ostatnia.

Zobacz też

Informacje

Konstruktory (C++)

Inicjatory konstruktora

Koncepcje

Typy zarządzane (C++/CL)