Darmowe Forum
Kwiecień 27, 2024, 17:28:35 *
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Forum zostało uruchomione!
 
   Strona główna   Pomoc Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Funkcje/zmienne statyczne  (Przeczytany 8947 razy)
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« : Marzec 14, 2012, 05:32:24 »

Modyfikator static sprawia, że obiekt w danej funkcji jest umieszczany w tej samej pamięci, co zmienna globalna i nie jest usuwany wraz z zakończeniem funkcji.

int licznik()
{
  static int a;
  a++;
  return a;
}
 

int main()
{
  cout<<"Wywoluje funkcje licznik"<<licznik();
  cout<<"\n...drugi raz "<< licznik();
 
}

Zmienna statyczna nawet lokalna nie jest usuwana. Będzie cały czas pamiętała swoją poprzednią wartość.
Porównaj jak działa zmienna statyczna i dynamiczna

#include <cstdlib>
#include <iostream>

using namespace std;
class drzewo
{public:
      virtual void pien(){cout<<"drzewo"<<endl;}};
class krzaczek :public drzewo
{public: void pien(){cout<<"krzaczek"<<endl;}};
int licznik(){static int a;
a++;
return a;};
int licznik1(){int b;
b++;
return b;}
int main(int argc, char *argv[])
{
cout<<"Wywolanie funkcji licznik "<<licznik()<<endl;
cout<<"Wywolanie drugi raz funkcji licznik "<<licznik()<<endl;

cout<<"Wywolanie funkcji licznik1 "<<licznik1()<<endl;
cout<<"Wywolanie drugi raz funkcji licznik1 "<<licznik1()<<endl;   
system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Marzec 14, 2012, 11:37:57 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #1 : Marzec 14, 2012, 05:38:17 »

Zmienne statyczne w klasach.
Statyczne pola klasy definiuje sie podobnie do zmiennych lokalnych, poprzez użycie słowa kluczowego static:


class samochod
{
  private:
    // dane opisujace samochód
  public:
    static int predkosc;
};
int samochod::predkosc;

Podobnie jak zmienna statyczna lokalna, statyczne pole klasy jest tworzone tylko raz, w tym samym obszarze co zmienne globalne i cały czas pamięta swoją ostatnią wartość. Pole statyczne jest tworzone zanim zostanie utworzony pierwszy obiekt danej klasy. Zazwyczaj - tworzone są już na samym starcie programu.

Tak jak zmienna lokalna pamięta swoją wartość pomiędzy kolejnymi wywołaniami, tak pole statyczne klasy pamięta swoją wartość "pomiędzy obiektami". Nie ważne z jakiego obiektu się do niego odwołasz, wartość będzie ta sama, wspólna dla wszystkich obiektów.

samochod ford, fiat, volvo;  //stworzenie 3 obiektow
fiat.predkosc = 100;
cout << ford.predkosc << endl;  //wypisze 100
volvo.predkosc = 120;
cout << fiat.predkosc << endl;  //wypisze 120

/////////////////////// ---Cały program---////////////////////////////////////////////////////////////////
#include <cstdlib>
#include <iostream>

using namespace std;

class samochod
{
public:
        static int predkosc;
        };
int samochod::predkosc;
int main(int argc, char *argv[])
{
   
samochod ford, fiat, volvo;
fiat.predkosc=100;
cout<<"ford "<<ford.predkosc<<endl;
volvo.predkosc=120;
cout<<"fiat "<<fiat.predkosc<<endl;

system("PAUSE");
    return EXIT_SUCCESS;
}

///////////////////-- kolejny program pokazujący ,że statyczne zmienne działają tylko dla potomków tylko tej samej klasy --//////////////////////////

#include <cstdlib>
#include <iostream>

using namespace std;

class samochod
{
public:
        static int predkosc;
        };
int samochod::predkosc;
class motor
{
public:
        static int predkosc;
        };
int motor::predkosc;
int main(int argc, char *argv[])
{   
samochod ford, fiat, volvo;
motor nsu, bmw, yamaha;
fiat.predkosc=100;

cout<<"ford "<<ford.predkosc<<endl;
cout<<"nsu "<<nsu.predkosc<<endl;
volvo.predkosc=120;
cout<<"fiat "<<fiat.predkosc<<endl;

system("PAUSE");
    return EXIT_SUCCESS;
}

« Ostatnia zmiana: Marzec 14, 2012, 13:03:11 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #2 : Marzec 14, 2012, 05:47:43 »

Metody statyczne
Metody statyczne klasy to metody, które są uruchamiane w kontekście danej klasy, tak jak zwykłe metody są uruchamiane w kontekście konkretnego obiektu. Oznacza to, że o ile zwykłe metody potrzebują obiektu do prawidłowego działania, to metody statyczne - można wywołać bez podawania jakiegokolwiek obiektu. Ma to jednak swoją cenę - metody statyczne mają dostęp jedynie do innych zmiennych statycznych i metod statycznych tej klasy.


//....
class rysio
{
  private:
    int a, b;
    static int c;
  public:
    static void dzialaj()
    {
      c=10;
      // b=10;     - błąd! 'b' nie jest statyczne! nie ma do niego dostępu
      // this->a = 10;  - błąd!! w metodach statycznych 'this' nie istnieje!!
    }

this - w C++, słowo kluczowe odnoszące się w niestatycznych metodach klasy do obiektu na rzecz którego dana metoda została wywołana.
Do obiektów odwołujemy się poprzez kropkę lub poprzez -> np.:

inaczej this : słowo kluczowe oznaczające referencję do obiektu, z którego wywołano metodę (inaczej mówiąc – oznacza referencję do samego siebie). Oczywiście nie można używać this wewnątrz metod statycznych (one nie są wywoływane na rzecz obiektu).

class Punkt
{
   int x;
   int y;
  public:
   int kolor;
   void pozx(int xx){x=xx;}
   void pozy(int y){y=yy;}
   void kolor(int kk){kolor=kk;}
};

main(void)
{
   Punkt p1;     //obiekt stworzony statycznie
   p1.kolor=10;      //odwołanie do pola przez kropkę
   p1.pozx(20);   //odwołanie do funkcji przez kropkę

   Punkt *wsk;   //wsk - wskaznik na obiekt klasy TPunkt

    wsk = new Punkt;   //operator new

   wsk->kolor=10;      //odwołanie do pola przez ->
   wsk->pozx(20);   //odwołanie do funkcji przez ->

   delete wsk;   //operator delete
}
« Ostatnia zmiana: Kwiecień 04, 2013, 09:05:00 wysłane przez admin » Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC | Sitemap

Polityka cookies
Darmowe Fora | Darmowe Forum

blackspider magiaslonca gry fastkillers tdw