Aşağıdaki yapı beyanına sahip olduğumu varsayalım (kurucu olmayan basit yapı). ŞimdiÜye yapı, memset çağırmadan yapıcı başlatıcı listesinden sıfır-init olabilir mi?
struct Foo
{
int x;
int y;
int z;
char szData[DATA_SIZE];
};
en bu yapı bir C üyesi olduğunu varsayalım ++ sınıfı aşağıdaki gibi:
class CFoobar
{
Foo _foo;
public:
CFoobar();
};
şöyle ben CFoobar yapıcısını bildirirseniz:
CFoobar::CFoobar()
{
printf("_foo = {%d, %d, %d}\n", _foo.x, _foo.y,_foo.z);
for (int x = 0; x < 100; x++)
printf("%d\n", _foo.szData[x]);
}
beklediğiniz gibi, ne zaman CFoobar'ın kurucusu çalışıyor, çöp verisi yazdırılıyor Açıkçası, kolay düzeltme memset veya ZeroMemory & _foo'dur.
CFoobar::CFoobar()
: _foo()
{
bu sıfır çıkış üyesi görünen o: Ben şöyle eğer hiçbir parametrelerle şantiye başlatma listesine _foo eklemek fark ettiniz ... Ancak ben her zaman ne yaptığımı
var _foo değişkenleri. En azından linux üzerinde g ++ ile durum buydu.
Şimdi benim sorum: Bu standart C++ mı yoksa bu derleyici özgü bir davranıştır? standart davranış ise
biri bana resmi bir kaynaktan gelen bir başvuru alıntı yapabilirsiniz? Daha karmaşık yapıları ve sınıfları olan örtük sıfır başlangıç davranışıyla ilgili herhangi bir "yakalama" var mı?
"Bazı popüler derleyiciler" = VC6 Varsayalım? Çünkü son 10 yıldaki herhangi bir derleyicide yanlış davranış görmedim. – MSalters
@MSalters: Ve ne yazık ki VS2005 ve VS2008 derleyicileri. Bunu VS2010'da denemedim. –
@MSalters: Yalnızca kullanıcı tarafından bildirilen kurucular olmadan POD olmayan yapı üyeleri için geçerli değildir; diğer türler düzgün çalışıyor. Connect'te bununla ilgili birkaç rapor var. Bu bulduğum bir tanesi: https://connect.microsoft.com/VisualStudio/feedback/details/484295/vc-does-not-value-initialize-members-of-derived-classes-without-user-declared-constructor –