Aracılığıyla paylaş


Referans Türleri için C++ Yığın Anlamları

Visual Studio 2005'in öncesinde, başvuru türünün bir örneği yalnızca atık toplanan yığında nesnesini oluşturan işleci kullanılarak new oluşturulabilirdi. Ancak, artık yığında yerel bir türün örneğini oluşturmak için kullanacağınız söz dizimini kullanarak bir başvuru türünün örneğini oluşturabilirsiniz. Bu nedenle, başvuru türünde bir nesne oluşturmak için ref new, gcnew kullanmanız gerekmez. Ve nesne kapsam dışına çıktığında, derleyici nesnenin yıkıcısını çağırır.

Açıklamalar

Yığın semantiği kullanarak bir başvuru türünün örneğini oluşturduğunuzda, derleyici örneği atık toplama yığınında (kullanarak gcnew) dahili olarak oluşturur.

bir işlevin imzası veya dönüş türü bir değere göre başvuru türünün bir örneğini içerdiğinde, işlev meta verilerde özel işleme gerektiren (modreq ile) olarak işaretlenir. Bu özel işleme şu anda yalnızca Visual C++ istemcileri tarafından sağlanır; diğer diller şu anda yığın semantiği ile oluşturulan başvuru türlerini kullanan işlevleri veya verileri kullanmayı desteklememektedir.

Yığın semantiği yerine (dinamik ayırma) kullanmanın gcnew bir nedeni, türün yok edicisi olmamasıdır. Ayrıca, işlev imzalarında yığın semantiğiyle oluşturulan başvuru türlerinin kullanılması, işlevlerinizin Visual C++ dışındaki diller tarafından kullanılmasını istiyorsanız mümkün olmaz.

Derleyici, bir başvuru türü için kopya oluşturucu oluşturmaz. Bu nedenle, imzada değere göre başvuru türü kullanan bir işlev tanımlarsanız, başvuru türü için bir kopya oluşturucu tanımlamanız gerekir. Bir başvuru türü için kopya oluşturucunun imzası şu biçimdedir: R(R%){}.

Derleyici, başvuru türü için varsayılan atama işleci oluşturmaz. Atama işleci, yığın semantiği kullanarak bir nesne oluşturmanıza ve yığın semantiği kullanılarak oluşturulan mevcut bir nesneyle başlatmanıza olanak tanır. Başvuru türü için atama işlecinin imzası şu biçimdedir: void operator=( R% ){}.

Türünüzün yıkıcısı kritik kaynakları serbest bırakırsa ve başvuru türleri için yığın semantiği kullanırsanız, yıkıcıyı açıkça çağırmanız (veya çağrısı deleteyapmanız) gerekmez. Başvuru türlerindeki yıkıcılar hakkında daha fazla bilgi için bkz . Nasıl yapılır: Sınıfları ve yapıları tanımlama ve kullanma (C++/CLI) konusunda yıkıcılar ve sonlandırıcılar.

Derleyici tarafından oluşturulan atama işleci, aşağıdaki eklemelerle normal standart C++ kurallarını izler:

  • Türü başvuru türünün tanıtıcısı olan statik olmayan tüm veri üyeleri sığ kopyalanır (türü işaretçi olan statik olmayan bir veri üyesi olarak değerlendirilir).

  • Türü değer türü olan statik olmayan tüm veri üyeleri sığ kopyalanır.

  • Türü bir başvuru türünün örneği olan statik olmayan herhangi bir veri üyesi, başvuru türünün kopya oluşturucusunun çağrısını çağırır.

Derleyici ayrıca yığın semantiği kullanılarak oluşturulan başvuru türünün bir örneğini temel alınan tanıtıcı türüne dönüştürmek için birli işleç sağlar % .

Aşağıdaki başvuru türleri yığın semantiğiyle kullanılamaz:

Örnek

Açıklama

Aşağıdaki kod örneğinde, yığın semantiği ile başvuru türlerinin örneklerini bildirme, atama işlecinin ve kopya oluşturucunun nasıl çalıştığı ve yığın semantiği kullanılarak oluşturulan başvuru türüyle izleme başvurusunun nasıl başlatılmadığı gösterilmektedir.

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);
}

Çıktı

98
98
98
13
13

Ayrıca bkz.

Sınıflar ve Yapılar