[C++] Składniki statyczne klasy

Witam!

Mam kilka pytań odnośnie składników statycznych.

1 sprawa:

Dotyczy sposobu używania tych składników. W mojej książce można przeczytać, że:

Ma cechę external ale wtedy kiedy wstawimy do danego pliku - nagłówek z klasą. O to chodzi :?:

mojaklasa.h

#ifndef MOJAKLASA

#define MOJAKLASA

class mojaklasa

{

public: 

    static int obiekt_stat;

    void funkcja();

};

#endif

1_plik.cpp

#ifndef MOJAKLASA

#define MOJAKLASA

class mojaklasa

{

public: 

    static int obiekt_stat;

    void funkcja();

};

#endif

2_plik.cpp

#include 

#include "mojaklasa.h"

using namespace std;

//////////////////////////////////////////////////

int mojaklasa::obiekt_stat;


void funkcja()

{

    //ciało funkcji...

}

//////////////////////////////////////////////////

2 sprawa:

Pod koniec działu jest takie ćwiczenie jedno:

Chodzi o to, że obiekt statyczny ma typ, którego nazwa nie uwzględnia klasy. Tzn. jest po prostu int (a nie moja_klasa::int ). I dzięki temu, kompilator “domyśla się”, że jest to składnik statyczny :?:

To “cecha” języka, że musimy dołączać nagłówki(choć AFAIK tego standard nie wymaga) bo bez nich nie wie gdzie co jest. External informuje nas o tym, że dana wartość jest taka sama dla danej aplikacji(dla danego exeka).

Czasami ciężko zadania Grębosza zrozumieć :wink: Z tego co zrozumiałem chodzi o to:

.h:

class Klasa

{

public:

    static int zxc;

};

.cpp:

#include ".h"

int Klasa::zxc = 5;

Chodzi o brak static w pliku źródłowym.

No wiem - pytanie brzmi: dlaczego właśnie pomimo:

kompilator “wie”, że chodzi o static.

Wcześniej musi nastąpić deklaracja klasy, więc kompilator ma informację, że istnieje klasa Klasa i ma składnik statyczny o nazwie XXX. Przy takiej składni nie może być to nic innego. Słowo kluczowe static w przestrzeni globalnej ma inne znaczenie. W sumie “static int Klasa::pole = 2” też mogłoby być, ale po co się powtarzać? Tak samo nie powtarza się słów kluczowych inline, virtual (o ile mnie pamięć nie myli).