Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Visual Studio 2005'in öncesinde, başvuru türünün bir örneği yalnızca new operatörü kullanılarak, çöp toplanan yığında nesnesini oluşturarak yaratılabilirdi. 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.
gcnew (dinamik ayırma) kullanmanın, yığın semantiği yerine tercih edilmesinin bir nedeni, türün yok ediciye sahip 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üne ait bir atama operatörünün imzası şu biçimdedir: void operator=( R% ){}.
Türünüzün yıkıcısı kritik kaynakları serbest bırakıyorsa ve başvuru türleri için yığın semantiği kullanıyorsanız, yıkıcıyı (veya çağrısını delete) açıkça çağırmanız gerekmez. Başvuru türlerindeki yıkıcılar hakkında daha fazla bilgi için, "Nasıl yapılır: Sınıfları ve yapıları tanımlama ve kullanma (C++/CLI)" konusundaki "Yıkıcılar ve Sonlandırıcılar" bölümüne bakın.
Derleyici tarafından oluşturulan atama işleci, aşağıdaki eklemelerle normal standart C++ kurallarını izler:
Başvuru türüne işaret eden türdeki statik olmayan veri üyeleri sığ kopyalanır (statik olmayan veri üyeleri işaretçi türündeymiş gibi değerlendirilir).
Türü değer türü olan statik olmayan tüm veri üyeleri sığ olarak 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 bir başvuru türü örneğini altta yatan tanıtıcı türüne dönüştürmek için % ünar bir 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ğiyle başvuru türlerinin örneklerini bildirme, atama işlecinin ve kopya kurucunun 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ıldığı 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