ast44 Temat założony przez niniejszego użytkownika |
Funkcje/metody oraz zmienne/pola statyczne. » 2016-02-29 23:51:12 Witam, chciałem usystematyzować wiedzę na temat podanego wyżej zagadnienia : a)pole statyczne - wartość którą przechowuje jest wspólna dla wszystkich obiektów danej klasy i można się do nie odwoływać nawet wtedy gdy żaden obiekt jeszcze nie istnieje.
b)metoda statyczna - może obsługiwać wyłącznie pola statyczne i może być wywoływana nawet wtedy gdy żaden obiekt jeszcze nie istnieje, dlatego nie ma dostępu do wsaźnika this. Jednak w zasadzie po co jest używana skoro "zwykłe", niestatyczne funkcje mogą również obsługiwać pola statyczne ?
c)zmienna statyczna - inicjalizowana raz i widoczna we wszystkich blokach (funkcje, klasy itd) programu
d)funkcja statyczna - tutaj w zasadzie nie wiem o co chodzi |
|
carlosmay |
» 2016-03-01 00:37:26 Statyczne zmienne i metody w klasiea)pole statyczne - wartość którą przechowuje jest wspólna dla wszystkich obiektów danej klasy i można się do nie odwoływać nawet wtedy gdy żaden obiekt jeszcze nie istnieje. |
Elementy statyczne danej klasy są pojedynczymi elementami, niezależnie od ilości obiektów danej klasy. Są związane z daną klasą. np. dla 100000 obiektów klasy jest nadal jedna zmienna statyczna. funkcja statyczna - tutaj w zasadzie nie wiem o co chodzi |
Można odwołać się w main() do prywatnej statycznej zmiennej bez potrzeby tworzenia obiektu danej klasy. Można też pobrać wartość tej zmiennej bez konieczności wywoływania metody dla obiektu. zmienna statyczna - inicjalizowana raz i widoczna we wszystkich blokach (funkcje, klasy itd) programu |
Jeśli jest prywatną zmienną statyczną, nie ma do niej bezpośredniego dostępu z miejsc niezwiązanych z daną klasą. metoda statyczna - może obsługiwać wyłącznie pola statyczne i może być wywoływana nawet wtedy gdy żaden obiekt jeszcze nie istnieje, dlatego nie ma dostępu do wsaźnika this. |
Jest powiązana z daną klasą, ale nie obiektami danej klasy. Tworzony jest tylko jeden egzemplarz takiej metody, więc nie może odnieść do pól powiązanych z obiektami (bo do którego miałaby mieć dostęp?). |
|
ast44 Temat założony przez niniejszego użytkownika |
» 2016-03-01 00:58:32 Akurat chodziło mi o rozgraniczenie : w klasie są pola i metody statyczne i wszystko co z nimi związane, natomiast zmienne i funkcje statyczne to elementy nie mające nic wspólnego z klasą (po prostu są takie elementy poza klasą i one jakoś tam działają).I właśnie o ile rozumiem o co chodzi z polami i zmiennymi statycznymi to nie rozumiem po pierwsze sensu metod statycznych (czyli funkcji statycznych w klasie, które mogą obsługiwać jedynie składniki statyczne, natomiast niestatyczne metody mogą obsługiwać zarówno pola niestatyczne jak i statyczne - więc nie rozumiem sensu istnienia metod statycznych ), a po drugie nie wiem w ogóle co daje zadeklarowanie funkcji jako statycznej (czyli teraz chodzi o tę poza klasą). |
|
carlosmay |
» 2016-03-01 08:56:32 natomiast zmienne i funkcje statyczne to elementy nie mające nic wspólnego z klasą (po prostu są takie elementy poza klasą i one jakoś tam działają). |
Mające. Są powiązane z tą klasą. Dostępne tylko w przestrzeni nazw tej klasy. więc nie rozumiem sensu istnienia metod statycznych ), a po drugie nie wiem w ogóle co daje zadeklarowanie funkcji jako statycznej (czyli teraz chodzi o tę poza klasą) |
Zmienna statyczna jest zmienną dostępną dla każdego stworzonego obiektu, ale jest tylko jeden egzemplarz tej zmiennej. Metoda statyczna może być zdeklarowana w bloku klasy, ale jest tworzony tylko jeden egzemplarz. więc nie rozumiem sensu istnienia metod statycznych |
Przykład: jest jakaś funkcja, w której nie masz dostępu do żadnych obiektów danej klasy. Jest potrzeba odczytanie danych ze zmiennej statycznej (prywatnej, bo nie chcesz aby ktoś zmieniał jej wartość z dowolnego miejsca), a obiekty są monstrualnie duże i nie ma potrzeby tworzenia tego obiekty poza odczytem statycznej wartości. class C { int n; static int stat; public: int getStat() { return stat; } int upStat() { ++stat; } int downStat() { --stat; } }
void fun() { int temp = C::getStat();
Poza tym metody statyczne określają interfejs zmian wartości pola statycznego i są one dostępne wszędzie (ale tylko te dwie), inne działania na polu statycznym można oprogramować dla metod obiektu. Właśnie o to chodzi, aby obiekty miały pełny dostęp do zmiennej statycznej. Natomiast z zewnątrz jest ograniczony do metod statycznych, ale jest dostępny bez konieczności budowania (kosztownego) obiektu. W programie może być potrzeba zmieniania tej wartości osobno, ale chcemy aby była powiązana z klasą. Jeśli nie ma potrzeby modyfikować pola statycznego z dowolnego miejsca w programie, nie ma potrzeby definiowania metod statycznych. |
|
Monika90 |
» 2016-03-01 09:57:39 W skrócie #include <iostream>
int x;
static int y;
void f() { }
static void g() { }
int h() { static int x; ++x; return x; }
int main() { std::cout << h() << std::endl; std::cout << h() << std::endl; std::cout << h() << std::endl; }
|
|
ast44 Temat założony przez niniejszego użytkownika |
» 2016-03-01 13:58:27 Monika90, bardzo dziękuję, dokładnie o takie wyjaśnienie mi chodziło w kontekście funkcji i zmiennych statycznych z poza klasy.Intrygują mnie jeszcze trzy rzeczy.Po mamy pierwsze int x oraz static int x. W związku z tym że int x jest widziany w bloku funkcji h() to czy nie spowoduje to konfliktów z static int x ? W szczególności jak bym musiał rozróżnić odwołania w funkcji do nich skoro oba mają taką samą nazwę ? Po drugie mogłabyś coś więcej powiedzieć o jednostce translacji ? Po prostu chodzi o to że w projekcie może być wiele plików .cpp i zmienne statyczne nie są potem eksportowane jak się łączy ? I po trzecie, rozumiem że funkcje, metody itd zmieniając zmienne globalne zmieniają je nie tylko w obrębie danej klasy, funkcji ale w całym programie (tak jakbym działał na wskaźnikach czy referencjach) ?
carlosmay, dzięki już widzę chyba o co chodzi :) |
|
Monika90 |
» 2016-03-02 18:16:20 Zmienna lokalna zasłania tę globalną. Jeżeli musisz to możesz użyć operatora :: żeby uzyskać dostęp do zmiennej globalnej. int x = 0;
void f() { x = 5; int x = 7; std::cout <<::x << std::endl; ::x = 11; std::cout << x << std::endl; }
Nie używaj zmiennych globalnych to nie będziesz miał takich problemów. Każdy plik cpp będzie miał swoją własną prywatną kopię zmiennej statycznej, nawet jeśli zmienne zdefiniowane w różnych plikach mają tę samą nazwę. Bez static zmienna będzie jedna na cały program i musi mieć unikalną nazwę. Ale uwaga, zmienna static w klasie też jest tylko jedna na cały program, więc static znaczy różne rzeczy zależnie od kontekstu. |
|
« 1 » |