Sdílet prostřednictvím


Sémantika jazyka C++ zásobníku pro referenční typy

Před Visual C++ 2005 instance typu odkaz může vytvořit pouze pomocí new operátor, který vytvořil objekt na nesmyslné shromážděny haldy.Nyní však můžete vytvořit instanci typu odkazu pomocí stejné syntaxe, kterou použijete k vytvoření instance nativního typu v zásobníku.Proto není nutné používat ref new, gcnew (rozšíření komponent C++) k vytvoření objektu typu odkazu.A když objekt dostane mimo rozsah platnosti, kompilátor volání destruktoru objektu.

Poznámky

Při vytváření instance typu odkazu pomocí zásobníku sémantiku kompilátor interně vytvořit instanci shromážděné haldy uvolňování paměti (pomocí gcnew).

Při podpisu nebo return typ funkce zahrnuje instanci typu referenční hodnotou, budou položky označeny funkce v metadatech jako vyžadující zvláštní zacházení (s modreq).Tato zvláštní zpracování je v současné době k dispozici pouze klientům Visual C++; jiné jazyky nepodporují aktuálně náročná funkce nebo data, která pomocí referenční typy vytvořené pomocí zásobníku sémantiku.

Jedním z důvodů pro použití gcnew (dynamické přidělování) namísto zásobníku by sémantiku, pokud má typ bez destruktor.Také používání typů odkazů, které jsou vytvořeny s sémantiku zásobníku v podpisech funkce nebude možné v případě, že chcete, aby vaše funkce určené pro jiné jazyky než Visual C++.

Kompilátor nevygeneruje kopie konstruktoru pro typ odkazu.Proto pokud definujete funkce, která používá typ odkazu podle hodnoty v podpisu, je nutné definovat kopie konstruktoru pro typ odkazu.Kopie konstruktoru pro typ odkazu byl podpis v následujícím formátu: R(R%){}.

Kompilátor nevygeneruje operátor přiřazení výchozí pro typ odkazu.Operátor přiřazení můžete vytvořit objekt pomocí zásobníku sémantiky a inicializujte ji s existující objekt vytvořený pomocí zásobníku sémantiku.Operátor přiřazení pro typ odkazu byl podpis v následujícím formátu: void operator=( R% ){}.

Pokud váš typ destruktor uvolní důležitých prostředků a použití zásobníku sémantiky pro referenční typy, není nutné explicitně volání destruktoru (nebo volání delete).Další informace o destruktory v odkazové typy, viz Destruktory a finalizační metody v jazyce Visual C++.

Operátor přiřazení generovány kompilátor bude následovat obvyklá pravidla standard C++ následující položky:

  • Jakákoli data nestatické členy, jejichž typ je popisovač k typu odkazu budou nedávná zkopírované (zpracovávána jako nestatické datový člen, jehož typ je ukazatel).

  • Každý člen dat nestatickou, jejíž typ je typ hodnoty budou nedávná zkopírovány.

  • Každý člen dat nestatickou, jejíž typ je instancí typu odkazu vyvolá volání kopie konstruktoru typu odkazu.

Kompilátor poskytuje také % unární operátor převodu instance typu odkazu, který je vytvořen pomocí sémantiku zásobníku pro jeho základní typ popisovače.

Následující typy odkazů nejsou k dispozici pro použití s sémantiku zásobníku:

Příklad

ms177191.collapse_all(cs-cz,VS.110).gifDescription

Následující příklad kódu ukazuje, jak deklarovat instance odkazové typy zásobníku sémantice, jak se operátor přiřazení a kopie konstruktoru a způsob inicializace sledovací odkaz typu odkaz vytvořen pomocí zásobníku sémantiku.

ms177191.collapse_all(cs-cz,VS.110).gifKód

// stack_semantics_for_reference_types.cpp
// compile with: /clr
ref class R {
public:
   int i;
   R(){}

   // assignment operator
   void operator=(R% r) {
      i = r.i;
   }

   // copy constructor
   R(R% r) : i(r.i) {}
};

void Test(R r) {}   // requires copy constructor

int main() {
   R r1;
   r1.i = 98;

   R r2(r1);   // requires copy constructor
   System::Console::WriteLine(r1.i);
   System::Console::WriteLine(r2.i);

   // use % unary operator to convert instance using stack semantics
   // to its underlying handle
   R ^ r3 = %r1;
   System::Console::WriteLine(r3->i);

   Test(r1);

   R r4;
   R r5;
   r5.i = 13;
   r4 = r5;   // requires a user-defined assignment operator
   System::Console::WriteLine(r4.i);

   // initialize tracking reference
   R % r6 = r4;
   System::Console::WriteLine(r6.i);
}

ms177191.collapse_all(cs-cz,VS.110).gifVýsledek

98
98
98
13
13

Viz také

Referenční dokumentace

Třídy a struktury (rozšíření komponent C++)