2013-11-09 9 views
7

C++ 11 şimdi böyle, beyan zaman sınıf üyesi alanının değerini ayarlama desteklerC++ 11 başlatılan üye alanlarını yeniden başlatıyor mu?</p> <pre><code>class MyClass { private int test = 0; } </code></pre> <p>Ben de böyle kurucusundaki değişkeni başlatmak durumunda:

class MyClass 
{ 
private 
    int test = 0; 

public: 
    MyClass() : test(1) 
    { 
    } 
} 

olacak Bu, değişkenin değerinin iki kez ayarlanmasına neden olur veya belirtim, derleyicinin değişkeni yalnızca bir kez başlatmak için bunu optimize etmesi gerektiğini belirtir. Eğer şartname hiçbir şeyi belirleyemezse, ünlü derleyicilerin (ör. MSVC, GCC, vb.) Davranışlarını biliyor musunuz?

cevap

14
Standart aslında bunun için bir kural vardır

, içinde §12.6.2/9:

verilen bir statik olmayan veri üyesi hem bir ayraç-ya-eşit-başlatıcı ve Mem-başlatıcı varsa mem-başlatıcı tarafından belirtilen başlatma gerçekleştirilir ve statik olmayan veri üyenin brace-or-equal-başlatıcısı göz ardı edilir. [Örnek: basit arg değerine i başlatır

struct A { 
int i = /∗ some integer expression with side effects ∗/ ; 
A(int arg) : i(arg) { } 
// ... 
}; 

bir (int) yapıcı

göz önüne alındığında, ve i'nin bağ ya da-Eşit kollu başlatıcısı olarak yan etkiler meydana olmaz. - varsayılan yapıcı çağrılıp çağrılmadığını

uç örneği] Yani anlatılan durumda, tanımlanmış tek başlatma orada yapılacaktır ve test1 olacaktır.

İlgili konular