Aracılığıyla paylaş


Başvuru tipleri için C++ yığın semantiği

Visual c++ 2005'ten önce bir başvuru türünün bir örneğini yalnızca kullanarak oluşturulabilir new toplanan öbek üzerinde çöp nesneyi oluşturan işleci.Ancak, artık yığında yerel türün bir örneğini oluşturmak için kullandığınız aynı sözdizimini kullanarak bir başvuru türünün bir örneğini oluşturabilirsiniz.Bu nedenle kullanmak gerekmez yeni başvuru, gcnew (C++ Bileşen Uzantıları) bir başvuru türünde bir nesne oluşturmak için.Ve nesne kapsam dışına çıktığında nesnenin yıkıcısı derleyici çağırır.

Notlar

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

Bir işlevin imza veya dönüş türü değeri tarafından başvuru türünün bir örneğini içerdiğinde, işlev meta verileri (modreq ile) özel işlem gerektiren olarak işaretlenir.Şu anda bu özel işleme ise yalnızca sağlanan Visual c++ istemciler tarafından; Diğer diller işlevleri veya yığın semantiği ile oluşturulan başvuru türleri kullanan veri kaybı desteklemez.

Kullanmak için bir neden gcnew (dinamik ayırma) yığın türü hiçbir yıkıcı varsa semantiği olacaktır.Ayrıca, yığın anlambilime işlev imzalarında içinde oluşturulan başvuru türleri kullanarak Visual c++ dışındaki diller tarafından tüketilecek işlevlerinizi istiyorsanız mümkün olmayacaktır.

Derleyici, başvuru tipine yönelik bir kopya oluşturucusuna oluşturmaz.Bu nedenle, imzada değeri tarafından başvuru türünü kullanan bir işlev tanımlayın, başvuru tipi için bir kopya oluşturucusuna tanımlamanız gerekir.Kopya oluşturucusuna bir başvuru türü için aşağıdaki biçimde bir imzaya sahip: R(R%){}.

Derleyici, bir başvuru türü için varsayılan atama işleci oluşturmaz.Atama işleci yığın mantığını kullanarak bir nesne oluşturur ve yığın semantiği kullanılarak oluşturulmuş varolan bir nesneyle başlatmak izin verir.Başvuru tipi için bir atama işleci aşağıdaki biçimde bir imzaya sahip: void operator=( R% ){}.

Tür 's yıkıcı kritik kaynakları serbest bırakır ve başvuru türleri için yığın semantiği kullanırsanız, yıkıcı açıkça çağırmak gerekmez (ya da delete).Yıkıcı başvuru türleri hakkında daha fazla bilgi için bkz: Visual C++ üzerinde Yok Ediciler ve Sonlandırıcılar.

Bir derleyici tarafından oluşturulmuş atama işleci aşağıdaki eklemelerle her zamanki gibi standart c++ kuralları izler:

  • (İşaretçi türü olan bir statik olmayan veri üyesi gibi kabul edilir) bir başvuru türü için bir tanıtıcı türü olan üyeleri herhangi bir statik olmayan veri kopyalanan shallow.

  • Türü bir değer türü sığ olan herhangi bir statik olmayan veri üyesi kopyalanır.

  • Başvuru türünün bir örneğini türü olan herhangi bir statik olmayan veri üyesi, başvuru türü'nün kopya oluşturucusuna bir çağrı harekete geçirecek.

Derleyici de sağlayan bir % temel tanıtıcı türü için yığın semantiği kullanılarak oluşturulan bir başvuru türünün bir örneği dönüştürmek için birli işleç.

Yığın semantiği ile kullanmak için aşağıdaki başvuru tipleri kullanılamaz:

Örnek

ms177191.collapse_all(tr-tr,VS.110).gifTanımlama

Aşağıdaki kod örneği nasıl bildirileceğini yığın semantiği başvuru türleriyle örneklerini gösterir nasıl atama işleci ve kopya yapıcı çalışır ve nasıl izleme başvurusu yığın semantiği kullanılarak oluşturulan başvuru türü ile başlatmak.

ms177191.collapse_all(tr-tr,VS.110).gifKod

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

ms177191.collapse_all(tr-tr,VS.110).gifÇıktı

98
98
98
13
13

Ayrıca bkz.

Başvuru

Sınıflar ve Yapılar (C++ Bileşen Uzantıları)