Sémantika jazyka C++ zásobníku pro referenční typy
Před Visual C++ 2005 instanci typu odkazu by lze vytvořit pouze pomocí new operátor, který vytvořil objekt na uvolnění haldě.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 obsahuje instanci typu referenční hodnotou, funkce budou označeny v metadatech jako vyžadující zvláštní zacházení (s modreq).Toto 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 dat, které používají 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í) místo zásobníku by sémantiku, pokud typ neobsahuje žádné destruktor.Používání typů odkazů, které jsou vytvořeny s sémantiku zásobníku v podpisech funkce by být možné, pokud chcete své funkce pro určené pro jiné jazyky než Visual C++.
Kompilátor nevygeneruje Kopírovat konstruktor pro typ odkazu.Proto pokud definujete funkce, která používá typ odkazu-hodnota v podpisu, je nutné definovat Kopírovat konstruktor pro typ odkazu.Kopírovat konstruktor pro typ odkazu má 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émantiku a inicializujte ji s existující objekt vytvořený pomocí zásobníku sémantiku.Operátor přiřazení pro typ odkazu má podpis v následujícím formátu: void operator=( R% ){}.
Pokud váš typ destruktor uvolní prostředky kritické a použití zásobníku sémantiky pro referenční typy, není nutné explicitně volat destruktor (nebo volání delete).Další informace o destruktory v typech odkazů naleznete v tématu Destruktory a finalizačních metod jazyka Visual C++.
Operátor přiřazení kompilátor generovat bude následovat obvyklá pravidla standard C++ následující položky:
Jakákoli data nestatické členy, jejichž typ je popisovač k typu odkazu bude Nedávná zkopírované (zacházet jako nestatické datový člen je typu ukazatel).
Zkopírovat všechny nestatické datový člen, jehož typ je typ hodnoty budou omezené.
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í zásobníku sémantiku na jeho základní typ popisovače.
Nejsou k dispozici pro použití s sémantiku zásobníku následující typy odkazů:
Příklad
Popis
Následující příklad kódu ukazuje, jak deklarovat instance typy odkazů s sémantiku zásobníku, jakým způsobem operátor přiřazení a Kopírovat konstruktor funguje a jak inicializovat sledování odkaz vytvořen pomocí zásobníku sémantiku typu odkaz.
Kó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);
}
Výsledek
98
98
98
13
13