Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Före Visual Studio 2005 kunde en instans av en referenstyp bara skapas med operatorn new , som skapade objektet på skräpinsamlingshögen. Nu kan du dock skapa en instans av en referenstyp med samma syntax som du skulle använda för att skapa en instans av en intern typ i stacken. Därför behöver du inte använda ref new, gcnew för att skapa ett objekt av en referenstyp. Och när objektet hamnar utanför omfånget anropar kompilatorn objektets destruator.
Anmärkningar
När du skapar en instans av en referenstyp med hjälp av stacksemantik, skapar kompilatorn internt instansen på skräpsamlad heap (med gcnew).
När signaturen eller returtypen för en funktion innehåller en instans av en värdebaserad referenstyp, kommer funktionen att markeras i metadata som kräver särskild hantering (med modreq). Den här särskilda hanteringen tillhandahålls för närvarande endast av Visual C++-klienter. andra språk stöder för närvarande inte användning av funktioner eller data som använder referenstyper som skapats med stacksemantik.
En anledning att använda gcnew (dynamisk allokering) i stället för stacksemantik skulle vara om typen inte har någon destructor. Dessutom är det inte möjligt att använda referenstyper som skapats med stacksemantik i funktionssignaturer om du vill att dina funktioner ska användas av andra språk än Visual C++.
Kompilatorn genererar ingen kopieringskonstruktor för en referenstyp. Om du definierar en funktion som använder en värdereferenstyp i signaturen måste du därför definiera en kopieringskonstruktor för referenstypen. En kopieringskonstruktor för en referenstyp har en signatur av följande form: R(R%){}.
Kompilatorn genererar inte någon standardtilldelningsoperator för en referenstyp. Med en tilldelningsoperator kan du skapa ett objekt med hjälp av stacksemantik och initiera det med ett befintligt objekt som skapats med hjälp av stacksemantik. En tilldelningsoperator för en referenstyp har en signatur av följande form: void operator=( R% ){}.
Om typens destruktor släpper viktiga resurser och du använder stacksemantik för referenstyper behöver du inte uttryckligen anropa destruktor (eller anropa delete). Mer information om destruktorer i referenstyper kan hittas i Destructors and finalizers in How to: Define and consume classes and structs (C++/CLI).
En kompilatorgenererad tilldelningsoperator följer de vanliga C++-standardreglerna med följande tillägg:
Alla icke-statiska datamedlemmar vars typ är ett handtag till en referenstyp kopieras ytligt (behandlas som en icke-statisk datamedlem vars typ är en pekare).
Alla icke-statiska datamedlemmar vars typ är en värdetyp kopieras ytligt.
Alla icke-statiska datamedlemmar vars typ är en instans av en referenstyp anropar ett anrop till referenstypens kopieringskonstruktor.
Kompilatorn tillhandahåller också en % unär operator för att konvertera en instans av en referenstyp som skapats med hjälp av stacksemantik till dess underliggande handtagstyp.
Följande referenstyper är inte tillgängliga för användning med stacksemantik:
Exempel
Beskrivning
Följande kodexempel visar hur du deklarerar instanser av referenstyper med stacksemantik, hur tilldelningsoperatorn och kopieringskonstruktorn fungerar och hur du initierar en spårningsreferens med referenstyp som skapats med hjälp av stacksemantik.
Kod
// 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);
}
Utgång
98
98
98
13
13