Soru std :: build-in tipi için harita varsayılan değeri


Son zamanlarda, std :: map operator [] işleviyle kafam karışmıştı. MSDN kitaplığında şöyle der: "Bağımsız değişken anahtar değeri bulunamadıysa, veri türünün varsayılan değeri ile birlikte eklenir." Bu konuyla ilgili tam olarak açıklama yapmayı denedim. Örneğin burada: std :: harita varsayılan değeri Bu sayfada Michael Anderson, "varsayılan değer varsayılan kurucu (sıfır parametre yapıcısı) tarafından oluşturuldu" dedi.

Şimdi benim arayış şu: "build-in tipi için varsayılan değer nedir?". Derleyici ile ilgili miydi? Ya da c ++ stardard komitesi tarafından bu konu için bir standart var mı?

Visual Studio 2008'de "int" tipi için bir test yaptım ve "int" tipi 0 değeriyle hesaplandı.


25
2017-12-24 03:12


Menşei


"Bool" tipi bir test yaptım. Ve garip bir şey var: "bool b = new bool ()" kullandığımda, b'nin değeri 0 olur; ama "bool * pb = new bool [10]" kullanırken; pb [0] = new bool (); " ve sonra pb [0], 1, karşıt değerdir. Oh, bu testi 2008'deki görsel stüdyoda yaptım. - WKPlus
Yazdığın zaman pb[0] = new bool();, new bool() bir Işaretçi, buna karşılık p[0] bir bool. Bir işaretçi örtülü olarak dönüştürülebilir boolve sonuç verir false işaretçi boş bir işaretçi ise true aksi takdirde. Yani gözlemlediğiniz gerçek değer size bunu söyler. new boş bir işaretçi döndürmedi (tabii ki düz değil) new bir daha asla yapmazsın. Ayrıca, tahsisini sızdırdınız. - Steve Jessop


Cevaplar:


Bu standart olarak tanımlanır, evet. Bu durumda harita "varsayılan başlatma" gerçekleştiriyor. Dediğiniz gibi, sınıf türleri için, argüman olmayan bir kurucu çağırır.

Yerleşik tiplerde, '98 standardı, bkz. Bölüm 8.5, "Başlatıcılar":

T türünde bir nesneyi varsayılan olarak başlatmak için:

  • eğer T bir POD değilse ...
  • T bir dizi tipi ise ...
  • aksi halde, nesne için depolama sıfır başlatıldı

Ve daha önce

T türünde bir nesnenin sıfıra yeniden başlatılması için:

  • T bir skaler tip ise, depolama T'ye dönüştürülen 0 (sıfır) değerine ayarlanır.

Skaler tipleri şunlardır:

  • Aritmetik tipler (tamsayı, kayan nokta)
  • Numaralandırma türleri
  • İşaretçi türleri
  • Üye türlerine işaretçi

Özellikle, bir tamsayı ile gördüğünüz davranış (sıfıra başlatılmış) standart tarafından tanımlanır ve buna güvenebilirsiniz.


24
2017-12-24 03:47



Bunu C ++ 11 standardında kontrol ettim ve farklı bir şey söylüyor. Bu tür bir sınıf veya dizi değilse, o zaman diyor ki başlatma yapılmıyor. Bu yüzden standart kaplarda artık varsayılan değerlerden emin değilim. - karadoc


C ++ 11 standardı yine de std :: map sıfır-başlangıçlarının (önceki standartta olduğu gibi) tiplerde oluşturulmasını gerektirmektedir, ancak nedenleri Luke Halliwell'in cevabındakilerden biraz farklıdır. Özellikle, yerleşik bir veri türünü 'varsayılan olarak' başlatmak için değil C ++ 11 standardında sıfır başlatma anlamına gelir, bunun yerine 'hiçbir şey yapmamak' anlamına gelir. Aslında ne olur std::map::operator[] bir 'değer-başlatma' dir.

Yine de, yeni standarttaki sonuç, Luke'un cevabındakiyle aynıdır. Değerler sıfır başlatılacak. İşte standardın ilgili bölümleri:

Bölüm 23.4.4.3 "harita öğesi erişimi" diyor

T & operatörü [] (const key_type & x);

Efektler: Haritada x'e eşdeğer bir anahtar yoksa, ekler value_type(x, T()) haritanın içine.

...

İfade T() bölüm 8.5’te açıklanmıştır

Başlatıcı boş bir parantez takımı olan bir nesne, yani () değer başlatıldı.

X a();

Ve bu tür 'değer-başlatma' aynı bölümde açıklanmıştır.

T türünde bir nesneyi değerlemeye başlamak için:

  • T kullanıcı tarafından sağlanan bir kurucu (12.1) ile bir (muhtemelen cv-kalifiye) sınıf tipi (Madde 9) ise, T için varsayılan kurucu   denir (ve T erişilebilir erişilemezse başlatma kötü biçimlendirilmiş   varsayılan kurucu);
  • T, kullanıcı tarafından sağlanan bir kurucu olmadan bir (muhtemelen cv-nitelikli) birliği olmayan sınıf tipi ise, nesne sıfır başlatılır ve eğer   T'nin örtülü olarak bildirilen varsayılan kurucusu önemsizdir,   kurucu denir.
  • eğer T bir dizi tipi ise, o zaman her elemanın değeri ilklendirilir;
  • aksi halde, nesne sıfır başlatılır.

17
2017-10-19 00:15





Sınıf türü nesnelerin varsayılan değeri, sınıfın varsayılan yapıcısı tarafından ayarlanan değerdir. Yerleşik tipler için varsayılan değer 0'dır.

Ancak, başlatılmayan yerleşik bir değişken ile varsayılan değer olarak başlatılan arasında bir fark olduğunu unutmayın. İlklendirilmemiş bir yerleşik, büyük ihtimalle o değişkenin o adreste bulunan bellek adresindeki herhangi bir değeri tutacaktır.

int i;          // i has an arbitrary undefined value
int x = int();  // x is 0

8
2017-12-24 03:25



Stroustrup'un sözlüğüne bakınız: www2.research.att.com/~bs/glossary.html - wilhelmtell
Güncel olmayan bağlantı yukarıda. Buraya bakın: stroustrup.com/glossary.html . Nasıl yardımcı olduğundan emin değil - Alexey


 |expression:   | POD type T                               | non-POD type T
 ==================================================================================================
 | new T         | not initialized                          | default-initialized
 | new T()       | always default-initialized               | always default-initialized
 | new T(x)      | always initialized via a constructor     | always initialized via a constructor

Bildiğim kadarıyla, stl, varsayılan değerler için yeni T () kullanır, bu nedenle int için 0 olduğunda varsayılan başlatılır.


3
2017-12-24 03:33



new T()  değer başlatmayı ifade eder. Değer Başlatma, Varsayılan Başlatma'dan farklıdır. - Prasoon Saurav
Yeni T () değer sıfırlama anlamına mı geliyor? Yeni T () kullandığımda, değer başlatma ve varsayılan başlatma arasındaki fark nedir? - WKPlus