static const int vs static int

0

Witam może ktoś pomóci mi do końca zrozumieć znaczenie atrybuty "static" w takich przykładach:

static int a = 10;
static const int a = 10; 

Chodzi mi o to, że z tego co wyczytałem to atrybut static pozwala na zapamietanie wartości zmiennej po każdej jej modyfikacji zapamiętując ostatnią modyfikacje,nawet w trakcie opuszczania funkcji.
Nie potrafie natomiast zrozumiec static const int a = 10, przecież jest to stała, a więc nie można zmieniać jej wartości, a więc jakie zastosowanie ma tutaj atrybut static.

0

static ma w C++ kilka znaczeń. Przykładowo static const int a = 10; umieszczone poza funkcją oznacza, że zmienna ta jest ograniczona do jednej jednostki kompilacji (jednego pliku źródłowego najczęściej).

0

No tak , ale nawet jeśli samo static int = 10 umiescisz poza funkcją to też bedzie oznaczalo , że zmienna ta jest ograniczona do jednej jednostki kompilacj.
A jakie znaczenie ma tam wstawienie const?

0

Tak jak pisałeś -- że jest stała i nie można jej zmienić.

0

No tak, ale to takim razie static przy const nie ma w ogole sensu bytu, no bo powiedzmy, że zdeklarowaliśmy w funkcji np. static const a = 10; to po co nam w tym miejscu static ,bo przecież ona ma za zadanie zapamietac po wyjsciu z funkcji jej ostatnią wartość, a jeśli jest to stała to nie bedzie nic modyfikowane, a wiec nie musi zapamietać jej ostatniej wartości, bo to samo da zapis const a = 10; bez atrybutu static.

0

Ale C++ to nie tylko funkcje, to też zmienne globalne, a przede wszystkim klasy. Zachowanie static zależy od kontekstu.

0

Nie mam pod ręką kompilatora C++, ale generalnie taki kod powinien się skompilować:

void metoda(int toNieJestConst) {
  int const aToJuzJestConst = toNieJestConst;
}

Natomiast taki kod już nie powinien:

void metoda(const int toJestConst) {
  static int const toTezJestConst = toJestConst;
}
0

W przypadku użycia static przy zmiennej lokalnej w funkcji, zmienna zachowuje się właśnie tak, jak mówisz -- zapamiętuje swoją wartość pomiędzy wywołaniami.
Zmienna statyczna zadeklarowana poza funkcjami, w zasięgu plikowym, to co innego -- o tym pisał Rev.
Czym innym są też składowe statyczne klasy, które są wspólne dla wszystkich obiektów danej klasy.

Co łączy wszystkie te "rodzaje" zmiennych statycznych to to, że wszystkie mają tzw. static storage duration, to znaczy że pamięć dla nich rezerwowana jest raz na początku programu i zwalniana dopiero, gdy program kończy działanie. W dodatku na takich zmiennych jest na początku wykonywane tzw. zero-initalization -- w przypadku inta po prostu nadanie mu wartości 0.

0

@Wibowit, dlaczego nie powinien?

0

Hmm, skompilował się, bez sensu.

Wynik działania to: http://ideone.com/EtWKk

0

Kompiluje się, bo inicjalizacja jest wykonywana tylko raz. Przy kolejnym wywołaniu funkcji ta linijka jest po prostu pomijana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1