To pytanie dręczy mnie już bardzo długo i nie wiem jaka jest różnica.
bo np
int a;
a=1;
czyli zadeklarowałem zmienną i zainicjowałem?
czy zdefiniowałem i zainicjowałem?
To pytanie dręczy mnie już bardzo długo i nie wiem jaka jest różnica.
bo np
int a;
a=1;
czyli zadeklarowałem zmienną i zainicjowałem?
czy zdefiniowałem i zainicjowałem?
int a; zarówno definiuje jak i deklaruje zmienną. Natomiast inicjujesz ją tutaj a=1;, zakładając że wcześniej nie nadałeś jej jakiejś wartości. Generalnie jednak inicjacja jest polecana już przy definicji/deklaracji czyli int a=1;
Deklaracja nadaje jakiejś nazwie znaczenie. Gdy podczas deklarowania będziemy mówić już o jakiejś konkretnej zmiennej, będzie ona również jej definicją. W przypadku zmiennych i C/C++ deklaracja bez definicji to ta bez inicjalizacji (bo to by się wiązało z jej definicją) oraz ze specyfikatorem extern
. Inicjalizacja to nadanie zmiennej jej początkowej wartości. Niekoniecznie musi być ona wykonania przez ciebie.
extern int a;
to sama deklaracja
int a;
to deklaracja z definicją
a = 1;
to inicjalizacja.
int a = 1;
to deklaracja z definicją i inicjalizacja
Deklaracja to powiedzenie, że a
będzie zmienną typu int. Definicja, że zmienna faktycznie znajduje się tutaj. Inicjalizacja, że jej początkowa wartość wyniesie 1
.
Znaczenie odpowiednich terminów może różnić się pomiędzy językami i technologiami.
Wydaje mi się że lepiej to widać w kontekście na przykład statycznych pól klas albo klas jako takich.
class A;
To deklaracja klasy. Mówi tylko o tym że A jest klasą, więc oznacza jakiś typ, ale nie wiadomo jeszcze co to za typ.
class A{
};
To jest już definicja klasy, bo mówi nam o tym jak ta klasa jest zbudowana, ile zajmie pamięci itd.
Rozdzielność deklaracji od definicji jest też obecna przy statycznych polach klasy - wielu ludzi ma z ty problem bo o tym nie wiedzą i dziwią się że takie coś:
class A{
static int x;
};
im nie chce działać. A nie chce, bo gdzieś trzeba tą zmienną zdefiniować, tzn tak jakby "nadać tej zmiennej pamięć" i w jakimś pliku źródlowym musi być
int A::x;