Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcje/metody oraz zmienne/pola statyczne.

Ostatnio zmodyfikowano 2016-03-02 18:16
Autor Wiadomość
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
P-145432
carlosmay
» 2016-03-01 00:37:26
Statyczne zmienne i metody w klasie

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.
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?).
P-145434
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ą).
P-145435
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.

C/C++
class C {
    int n;
    static int stat;
public:
    int getStat() { return stat; }
    int upStat() { ++stat; }
    int downStat() { --stat; }
    // ....
}

// .....

void fun() {
    int temp = C::getStat(); // nie ma innej możliwosci dostac sie do statycznej
    // tworzenie obiektu dla odczytania jednej wartości jest kosztownym procesem
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.
P-145443
Monika90
» 2016-03-01 09:57:39
W skrócie
C/C++
#include <iostream>

int x; //zmienna globalna dostępna w całym programie

static int y; //zmienna globalna dostępna tylko w tej jednostce translacji (pliku .cpp)

void f() { } //funkcja globalna dostępna w całym programie

static void g() { } //funkcja globalna dostępna tylko w tej jednostce translacji

int h()
{
    static int x; //zmienna lokalna, która pamięta swoją wartość pomiędzy wywołaniami funkcji
    ++x;
    return x;
}

int main()
{
    //wypisuje 1 2 3
    std::cout << h() << std::endl;
    std::cout << h() << std::endl;
    std::cout << h() << std::endl;
}
P-145446
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 :)
 
P-145447
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.

C/C++
int x = 0;

void f()
{
    x = 5; //globalne x = 5
   
    int x = 7; //od tej chwili lokalny x zasłania globalnego
   
    //ale wciąż można się do globalnego dostać
    std::cout <<::x << std::endl;
    ::x = 11;
    std::cout << x << std::endl; //a to jest lokalny x
}

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.

P-145493
« 1 »
  Strona 1 z 1