Megosztás a következőn keresztül:


C++ Veremszemantika referenciatípusokhoz

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

Lásd még

Osztályok és struktúrák