2015-06-21 19 views
5

Rozważ wprowadzenie jednej zmiennej obsługiwanej przez jeden plik .cpp, podczas gdy inne pliki .cpp używają tej wartości zmiennej do różnych celów.Zmienna między dwoma plikami źródłowymi (klasa i globalna)

przypadku korzystania z zajęć

// header.h 
class c { 
public: 
    static int f1(); 
    static int f2(); 
private: 
    static int v; 
}; 

// first.cpp 
int c::v(0); 

int c::f1() { return ++v; } 

// second.cpp 
int c::f2() { return ++v; } 

// main.cpp 
int main() { 
    cout << c::f1() << endl; 
    cout << c::f2() << endl; 
    return 0; 
} 

wyjściowa wynosi:

1 
2 

Przy stosowaniu w zakresie globalnym

// header.h 
int f1(); 
int f2(); 
static int v = 0; 

// first.cpp 
int f1() { return ++v; } 

// second.cpp 
int f2() { return ++v; } 

// main.cpp 
int main() { 
    cout << f1() << endl; 
    cout << f2() << endl; 
    return 0; 
} 

wyjściowa wynosi:

1 
1 

Jak to się stało, gdy wspomniany zmienną jest klasą, wyjście jest to, czego się spodziewać i nie jest inaczej? (Zdaję sobie sprawę, że za pomocą extern w drugiej części dałoby upragnionego rezultatu, sprawa jest raczej dlaczego static robót budowlanych w przypadku z klasą, ale nie o zasięgu globalnym?)

Odpowiedz

6

static ma więcej niż jedno znaczenie w C++ (projektanci języków faktycznie robią to bardzo często, aby zmniejszyć liczbę zarezerwowanych słów kluczowych).

  • static w klasie oznacza, że ​​jest to zmienna współdzielona przez wszystkie wystąpienia klasy.

  • static w jednostce kompilacji oznacza, że ​​nie można jej adresować w innej jednostce kompilacji. W tym przypadku napisałeś static w nagłówku; preprocesor (za pomocą `` # include`s) wstawił go do kompilowanych plików źródłowych. W każdym pliku źródłowym, w tym w tym nagłówku, oznacza to po prostu, że jest to zmienna lokalna dla tej jednostki kompilacji.

+0

Czy rozumiem poprawnie: każdy plik otrzymuje własną kopię tej zmiennej? Tak więc, jeśli OP gdzie umieścić 'f1()' i 'f2()' w tym samym pliku, to faktycznie dostałby '1' i' 2' jako wynik? Co więcej, gdyby nie zadeklarował 'v' jako' statycznego', to wszystkie pliki podzieliłyby tę zmienną i znowu wynik byłby '1' i' 2'? – dingalapadum

+0

@dingalapadum Całkowicie zgadzam się z pierwszą częścią. Jeśli chodzi o drugą część, nie całkiem - możesz mieć rację co do zasady, ale w tym przypadku linker będzie narzekał na zmienną mającą wiele definicji. –

+0

Rozumiem. Dziękuję Ci! – dingalapadum

1
  1. Słowo kluczowe static, gdy jest stosowany w class oznacza członkiem tej klasy jest podzielane przez wszystkich jego wystąpień. Tak więc za każdym razem, gdy v jest inkrementowany w class c, zwraca wartość większą niż poprzednia wartość.

  2. Ale kiedy słowo kluczowe static jest używane w przestrzeni globalnej, nie ma nic wspólnego z obiektami. static w przestrzeni globalnej oznacza TYLKO, do której zmienna v jest dostępna z poziomu tego pliku .cpp, w której jest zadeklarowana/zdefiniowana, oraz w plikach, w których jest to plik #include d. I nie można uzyskać dostępu z innych źródeł.

  3. static w OOP's jest zupełnie inny niż static w non-OOP's.

Powiązane problemy