Değişkenin veri türünün bir örneği olduğunu söylemek doğru mu?


9

(program süresince değerini değiştirebilir)

Yoksa 'bir şeyin örneği' kesinlikle sınıflar ve nesnelerle mi ilgili? Eğer öyleyse, C ++ söz konusu olduğunda 'değişken' kavramını nasıl tanımlarsınız?


C # ve Java iki ilginç şekilde C ++ 'dan farklıdır. İlk olarak, ilkel türleri nesne (ve yapı) türleriyle birleştirmeye çalışırlar (böylece int örneği hakkında konuşabilirsiniz), ancak C ++ bunu yapmaz. İkincisi, C # ve Java'da, nesne türlerinin değişkenleri öbekteki örneklere (sınıfların) dolaylı olarak referanstır ve ayrıca nesnelere işaretçilerden bahsetmiyoruz, oysa C ++ 'da, @ coredump'ın yanıtı, nesne türlerinin yerel değişkenleri gibi yığındaki örneklere bağlanır ve nesneleri ve işaretçileri nesnelere açıkça ayırırız.
Erik Eidt

Yanıtlar:


8

Gibi bildiğim kadarıyla, ilkel türleri çağrı değerlerine doğru örnekleri (örneğin bkz bu tür "C ++ Tip Sistemi" Visual Studio kılavuzu gelen, ama yine de başka bir kaynaktan arıyorum) Bu terim olduğuna inanıyoruz rağmen, çoğunlukla nesneler tartışılırken kullanılır. Bir nesne, C sınıfında veya alt sınıflarından birinde tanımlanan bir yapıcıdan oluşturulmuşsa, C sınıfının bir örneğidir.

C ++ 'da bir değişken çalışma zamanı kavramı değildir. Derleyicinizin içinde, değişkenin adı ile soyut (sabit değilse değiştirilebilir) konumu arasında sözcüksel bir bağ olarak bulunur. Bir program derlendikten sonra, değişkenler artık orada değildir. Bunun yerine veriler yazmaçlarda, bellekte vb. Okunur ve yazılır.


2
" İlkel türlerin değerlerinin genellikle bu türden örnekler olduğu söylenmez; nesnelere ve sınıflara ayrılmıştır. " Bu hiç doğru değil. Standardın hiçbir yerinde nesne olarak kabul edilmeyen ilkel tiplerin değerleri yoktur. Değişken tanımı, kullanıcı tanımlı bir sınıf mı yoksa ilkel bir tip mi olduğuna bağlı olarak hiçbir şekilde değişmez.
Nicol Bolas

@NicolBolas Hiç kimsenin tamsayılara C ++ bağlamında bir şeyin örnekleri olarak bahsettiğini duymadım ve standart açıkça belirtilmese bile, hiçbir şeyin örneği olmadığını söylemek doğru eminim . Değilse, ne örnekleri? Bu cevabın, ilkel tipler ve nesneler arasında bir değişken tanımının değiştiğini iddia ettiğini de görmüyorum; "doğru" bir değişken tanımıyla ilgisi olmadığını iddia ediyor gibi görünüyor.
Ixrec

2
@Ixrec: " Değilse, neye benziyorlar ? " Türü int. C ++ standardı, değişken bildirimlerin ne yaptığı hakkında konuşurken ilkel tipler ile ilkel olmayan tipler arasında bir ayrım yapmaz. Böylece T t;, Tne tür Tolursa olsun , bir tür nesne bildirir .
Nicol Bolas

1
@Ixrec: Değişmez değerlerin farklı bir şey olduğunu unutmayın. Değişmez değerler bir çeşit değerdir. Ancak değişmez değişkenler oluşturamazsınız, bu yüzden bu farklı bir tartışmadır.
Nicol Bolas

5

Yoksa 'bir şeyin örneği' kesinlikle sınıflar ve nesnelerle mi ilgili? Eğer öyleyse, C ++ söz konusu olduğunda 'değişken' kavramını nasıl tanımlarsınız?

C ++ için olabildiğince kısaca koymak

  • Bir değişken a, adı for a (kodunda) bellek konumu zamanında tespit edilmesi.
  • Bir örnek , bir olan nesne bellekte bulunan zamanında.

Açık olmak gerekirse:

  • Belleğin tüm alanları nesne içermez. Örneğin, bazı bellek alanları 'çöp' değerleri içerebilir.
  • Tüm bellek saklama nesnelerine kodda bir ad verilmeyecektir. Nesneler, dizideki bir konum gibi adlandırılmamış bellek alanlarında veya bir işaretçi tarafından başvurulan Yığın üzerinde bulunabilir .
  • Bir bellek alanı çöp içerdiğinde, bunun nedeni genellikle o konumda hiçbir nesne başlatılmamış olması veya önceden varolan bir nesnenin yok olmasıdır.

1
POD'lar C ++ içindeki nesnelerdir. Belleğin tüm bölgeleri nesne değildir, ancak POD'lar yalnızca bellek bölgeleri değildir.
Nicol Bolas

1
Ben ikinci NicolBolas: POD'lar nesneler. Bununla birlikte, yeni malloc()düzenlenen, ancak başlatılmamış bir arabellek hakkında konuştuğunuzda bir noktanız var : henüz nesne olmayan bir hafıza alanı. Aynı şekilde, açıkça tahrip olmuş bir nesne: Artık nesne olmayan bir hafıza bölgesi.
cmaster - eski haline monica

@NicolBolas adil yorum, bu ifadeyi biraz değiştirdim
Ben Cottrell

1

Peki "doğru" ne demek?

Bu konuda çok katı olmak istiyorsak, aşağıdakileri ayırt etmeliyiz:

  • Sözdizimi tarafı: ifadeler var (statik) türleri
  • Semantik taraf: nesneleri olan örnekleri arasında sınıfları

Bu durumda bir değişkenin - bir ifade olması - bir türü olacaktır. Değeri - bahsettiği nesne - bir sınıfın örneğidir. Değişkenin türü ve nesnenin sınıfı genellikle aynı şey değildir; değişkenin statik türü , nesnelerin çalışma zamanı sınıflarına bir üst sınır koyar , böylece sınıflar türe karşılık gelen sınıfın bir alt türü olmalıdır .

O büyük ağzı sürekli tekrarlamak ister misin? Heck hayır. Ne kadar katı ve gevşek konuşmak istiyorsak, bağlama bağlıdır. Çoğu zaman "değişkenin bu türden bir örnek olduğunu" söylemekte sorun yoktur. Gerçekte olan şey, nesneyi ve çalışma zamanı sınıfının bir üst sınıfını ifade etmek için değişkeni ve türü metonimik olarak kullanmamızdır.


1

Tüm hayatınızı saflık ve sofizm içinde geçirmek istemiyorsanız ... evet.

Benzersiz olarak tanımlanmış bir şeyi her tuttuğunuzda , somutlaştırdığınız diğer benzersiz tanımlanabilir şeyleri taklit etmek için bir kullanım sağlar .

  • Ürünlere örnek bir proje
  • Yürütülebilir dosyalara örnek teşkil eden bir kaynak
  • Şablon türlerine göre örneklenir.
  • Değişkenleri somutlaştıran bir tür.

Bu örneklemelerin bazıları daha doğru adlara sahip olabilir, ancak genel olarak bu işe yarar.


0

Birçok kişi sınıf örnekleri için "örnek" ayırır. Bunu C ++ 'da yaparsanız, bir değişken bir sınıf örneği, bir örneğe başvuru, bir örneğe işaretçi ya da ilkel bir tür olabilir (büyük olasılıkla yapıları bu bağlamdaki sınıflar olarak saymış olursunuz) tamamen aynı). Java veya Objective-C'de değişkenler asla örnek değil, büyük olasılıkla örneklere referans olur.

Unuttum: Kısa bir süre için, bir C ++ işaretçisi ham belleğe bir işaretçi olabilir, örneğin yapıcı çalışmaya başlamadan önce "this". Muhtemelen bu noktaya henüz * örnek demezdiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.