Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Visual Studio 2005 előtt csak az new operátorral hozható létre hivatkozástípus egy példánya, amely létrehozta az objektumot a szemétgyűjtő halomra. Most azonban létrehozhat egy hivatkozástípus egy példányát ugyanazzal a szintaxissal, mint amellyel natív típusú példányt hozna létre a veremen. Ezért nem kell a ref new, gcnew parancsot használnia egy referenciatípusú objektum létrehozásához. Amikor az objektum kikerül a hatókörből, a fordító meghívja az objektum destruktorát.
Megjegyzések
Amikor egy referenciatípus egy példányát veremszemantikával hozza létre, a fordító belülről létrehozza a példányt a szemétgyűjtő halmon (a gcnew használatával).
Ha egy függvény aláírási vagy visszatérési típusa tartalmaz egy értékalapú hivatkozástípus egy példányát, a függvény speciális kezelésre szorulóként lesz megjelölve a metaadatokban (modreq használatával). Ezt a speciális kezelést jelenleg csak a Visual C++ ügyfelek biztosítják; más nyelvek jelenleg nem támogatják a stack szemantikával létrehozott referenciatípusokat használó függvények vagy adatok használatát.
A veremszemantika helyett a dinamikus foglalás gcnew használatának egyik oka az lehetne, amennyiben a típusnak nincs destruktora. A függvényaláírásokban veremszemantikával létrehozott referenciatípusok használata nem lehetséges, ha azt szeretné, hogy a függvényeket a Visual C++-on kívül más nyelvek is használják.
A fordító nem hoz létre példánykonstruktort referenciatípushoz. Ezért ha olyan függvényt határoz meg, amely az aláírásban értékalapú hivatkozástípust használ, meg kell adnia egy példánykonstruktort a referenciatípushoz. Egy referenciatípus példánykonstruktorának aláírása az alábbi formátumú: R(R%){}.
A fordító nem hoz létre alapértelmezett hozzárendelés-operátort egy referenciatípushoz. A hozzárendelési operátorok lehetővé teszik, hogy veremszemantikával hozzon létre egy objektumot, és inicializálja azt egy meglévő objektummal, amelyet veremszemantikával hoztak létre. Egy referenciatípus hozzárendelési operátora a következő űrlap aláírásával rendelkezik: void operator=( R% ){}.
Ha a típus destruktorja kritikus erőforrásokat bocsát ki, és a referenciatípusokhoz veremszemantikát használ, nem kell explicit módon meghívnia a destruktort (vagy meghívni delete). A referenciatípusok destruktoraival kapcsolatos további információkért lásd : Destruktorok és véglegesítők a Hogyan: Osztályok és szerkezetek definiálása és felhasználása (C++/CLI) című témakörben.
A fordító által létrehozott hozzárendelés-operátor a szokásos szokásos C++ szabályokat követi a következő kiegészítésekkel:
Az összes olyan nem statikus adattag, amelynek típusa egy referenciatípus mutatója, felületesen másolódik (úgy kezelve, mint egy olyan nem statikus adattagot, amelynek típusa mutató).
Minden olyan nem statikus adattag, amelynek típusa értéktípus, sekélyen lesz másolva.
Minden olyan nem statikus adattag, amelynek a típusa egy referenciatípus példánya, meghív egy hívást a referenciatípus másolási konstruktorára.
A fordító emellett egy unáris operátort % is biztosít, amely a verem szemantika alkalmazásával létrehozott referenciatípus egy példányát konvertálja a mögöttes fogantyútípusra.
A következő referenciatípusok nem használhatók veremszemantika esetén:
példa
Leírás
Az alábbi kódminta bemutatja, hogyan deklarálhatók a referenciatípusok példányai a veremszemantikával, hogyan működik a hozzárendelési operátor és a másolási konstruktor, és hogyan inicializálható egy követési hivatkozás a veremszemantika használatával létrehozott referenciatípussal.
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);
}
Kimenet
98
98
98
13
13