2011-11-25 20 views
12

C ve C++ 'da tüm statik değişkenler varsayılan olarak Sıfırla olarak başlatılır.Neden statik sınıf değişkenlerini C++ ile başlatmalıyım?

Bu, statik sınıf veri üyeleri için geçerli değildir. Neden?

sınıfı kapsamına de
#include <iostream> 
using namespace std; 

int var; 

class MyClass 
{ 
public: 
    static int classVar; 
}; 
int MyClass::classVar = 0; // Why I have to init it here? 

int main(void) 
{ 
    cout << ::var << endl;   // this is initalized to ZERO by default 
    static int var; 
    cout << var << endl;   // and this also is initalized to Zero 
    cout << MyClass::classVar << endl; 

    return 0; 
} 
+0

** var ** 'nın 0 olarak başlatıldığından emin değilsiniz. Muhtemel, olası, ancak emin değil. –

+3

@AlessandroPezzato: Gerçekte, dinamik başlatma işlemine başlamadan önce, tüm global değişkenler için belleği sıfırlama konusunda açık bir anlam var ... bir değişmez değerin etkilendiği bu yerleşiklerden ayrı olarak, doğrudan etkileyebileceğimi düşünüyorum. gözetim altında olduğu için). –

cevap

21

,

int MyClass::classVar = 0; // Why I have to init it here? 

bir tanımı ve

static int classVar; 

bir beyan, yani olmasıdır. Bir değişken tanımlanmış bir yerde olacaktır: tam olarak tanımladığınız değişkenleri tanımlamanız gerekir.

Gerekçe, sınıf bildiriminin büyük olasılıkla çoklu kaynak dosyalarında yer alacağıdır. Bunun bir parçası bir tanım olurdu, çarpılacaktı: bu hatalı (istisnalar satır içi [üye] fonksiyonlar). değeri başlatma kurallarına göre, bir tanım olarak

int MyClass::classVar; // Zero-initialized ! 

ile birlikte almak için

not edin.

int var; 

bir deklarasyon ve tanımı şöyledir:: namespace etki alanında bildirilmiş

Değişkenler (onlar nitelikli extern olmadıkça) de tanımlar sen bir başlık içine koymak ve çoklu çeviri birimlerinde bunu eklerseniz, bir hata var ("çarpanı tanımlanmış sembol" veya bu satırlar boyunca bir şey).

[C Not ++

(olup C) var yukarıda const ise, otomatik olarak static olur ve çok-katlı dahil başlığına konulmalıdır bir tanımı kural ihlal edilmez. Bu biraz konu dışı gider, ama]

+2

Sorulan şeyin olduğundan emin değilim. Bunu "neden oraya koymam gerekiyor?" Diye okudum. – Mat

+0

@Alexandre C .: Bunun neden gerekli olduğunu açıklarsanız iyi olur. – Nawaz

+3

Yani, int Sıfır başlatmayı gerektiriyorsa, int Integlass :: classVar; Bunu hiç denemedim ama Std'ye ve silinen bir cevaba göre aslında öyle. – zerm

2

Statik sınıf veri değişkenlerinizi başlatmanız gerekir, çünkü derleyiciye değerlerinin ne olduğunu bildirmeniz gerekir. Sınıfların varsayılan bir değer kavramına sahip olmaları gerekmez. Bu durumun aksine, bir string "" vb, double 0.0 için 0, int için

Değişken tipleri, bir mantıksal "sıfır değerine" sahip sınıfları mutlaka bir varsayılan değeri yoktur. Örneğin, class Rectangle'u düşünün. Sıfır değeri nedir - sıfır kare veya birim yan uzunluğa sahip bir dikdörtgen olan bir dikdörtgen mi?Statik değişkenler için, derleyici kendiniz tanımlamanızı ister. Statik değişkeninizin sahip olması gereken değer, çünkü her veri türü varsayılan bir değerle başlatılamaz.

+1

Bence Burada hatalısınız: hiçbir şey statik bir değişken tanımlamaktan ve onu başlatmamaktan alıkoyar. Eğer değişken bir sınıfın bir örneğiyse, kurucusu çağrılır. – qdii

+0

Statik değişkenin tanımlanması gerekir. ... Örneğin aşağıda düşünün "int testi :: k;" Eğer. derlenemeyecektir.Ancak olmaz yorumladı edilecek sınıf testi { public: statik int k; }; int test :: k; int main() { test t; cout << t.k; 0; } – rakesh

+0

@victor Evet, haklısınız, bunu bana bildirdiğiniz için teşekkür ederim. Soru, statik bir değişkenin tanımlanması ve başlatılmasının olmamasıydı. –

İlgili konular