DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz czytać Dzwon?
Bez spamu

Następnie możemy uzyskać do nich bezpośredni dostęp poprzez nazwę klasy i operator rozpoznawania zakresu. Ale co, jeśli statyczne zmienne składowe są prywatne? Rozważ następujący kod:

W tym przypadku nie możemy uzyskać bezpośredniego dostępu do Anything :: s_value z main(), ponieważ ten element członkowski jest prywatny. Zazwyczaj dostęp do prywatnych członków klasy uzyskuje się za pomocą metod publicznych. Chociaż moglibyśmy stworzyć normalną metodę dostępu do s_value, musielibyśmy stworzyć obiekt tej klasy, aby użyć tej metody! Jest lepsza opcja: możemy uczynić metodę statyczną.

Podobnie jak statyczne zmienne składowe, metody statyczne nie są powiązane z żadnym pojedynczym obiektem klasy. Oto przykład powyżej, ale z metodą statyczną:

class Anything (private: static int s_value; public: static int getValue () (return s_value;) // metoda statyczna); int Wszystko :: s_value = 3; // zdefiniuj statyczną zmienną składową klasy int main() (std :: cout<< Anything::getValue() << "\n"; }

Ponieważ metody statyczne nie są powiązane z konkretnym obiektem, można je wywoływać bezpośrednio za pomocą operatora rozpoznawania nazw klas i zakresu, a także za pośrednictwem obiektów klas (ale nie jest to zalecane).

Metody statyczne nie mają * tego wskaźnika

Metody statyczne mają dwie interesujące cechy. Po pierwsze, ponieważ metody statyczne nie są powiązane z obiektem, nie są! Ma to sens, ponieważ wskaźnik * this zawsze wskazuje na obiekt, z którym pracuje metoda. Metody statyczne mogą nie działać przez obiekt, więc wskaźnik * this również nie jest potrzebny.

Po drugie, metody statyczne mogą bezpośrednio uzyskiwać dostęp do innych statycznych elementów członkowskich (zmiennych lub funkcji), ale nie mogą uzyskać dostępu do niestatycznych elementów członkowskich. Dzieje się tak, ponieważ niestatyczne składowe należą do obiektu klasy, podczas gdy metody statyczne nie!

Jeszcze jeden przykład

Metody statyczne można definiować poza treścią klasy. Działa to w taki sam sposób, jak w przypadku zwykłych metod. Na przykład:

#zawierać class IDGenerator (private: static int s_nextID; // deklaracja statycznej zmiennej składowej public: static int getNextID (); // deklaracja metody statycznej); // Definicja statycznej zmiennej składowej znajduje się poza treścią klasy. Zauważ, że nie używamy tutaj słowa kluczowego static // Zacznij generować identyfikator od 1 int IDGenerator :: s_nextID = 1; // Definicja metody statycznej znajduje się poza treścią klasy. Zauważ, że nie używamy tutaj słowa kluczowego static int IDGenerator :: getNextID () (zwróć s_nextID ++;) int main () (for (liczba int = 0; liczba< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

#zawierać

klasa IDGenerator

prywatny:

statyczny int s_nextID; // zadeklaruj statyczną zmienną składową

publiczny:

statyczne int getNextID (); // deklaracja metody statycznej

// Rozpocznij generowanie identyfikatora od 1

int IDGenerator :: s_nextID = 1;

int IDGenerator :: getNextID () (zwróć s_nextID ++;)

wew główna ()

for (liczba int = 0; liczba< 4 ; ++ count )

std :: cout<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

zwróć 0;

Wynik uruchomienia powyższego programu:

Następny identyfikator to: 1
Następny identyfikator to: 2
Następny identyfikator to: 3
Następny identyfikator to: 4

Uwaga, ponieważ wszystkie zmienne i funkcje tej klasy są statyczne, nie musimy tworzyć obiektu tej klasy, aby z nim pracować! Statyczna zmienna członkowska służy do przechowywania wartości następnego identyfikatora, który ma być do niej przypisany, a metoda statyczna służy do zwracania identyfikatora i zwiększania go.

Ostrzeżenie o klasach ze wszystkimi członkami statycznymi

Zachowaj ostrożność podczas pisania klas ze wszystkimi elementami statycznymi. Chociaż te „czysto statyczne klasy” mogą być przydatne, mają też swoje wady.

Po pierwsze, ponieważ wszystkie statyczne elementy członkowskie są tworzone tylko raz, nie może istnieć wiele kopii „czysto statycznej klasy” (bez klonowania klasy i dalszego zmieniania jej nazwy). Na przykład, jeśli potrzebujemy dwóch niezależnych obiektów klasy IDGenerator, to nie będzie to możliwe poprzez klasę „czysto statyczną”.

C++ nie obsługuje konstruktorów statycznych

Jeśli możesz zainicjować zwykłą zmienną składową poprzez, to logicznie rzecz biorąc, powinieneś być w stanie zainicjować statyczne zmienne składowe za pomocą statycznego konstruktora. I chociaż niektóre współczesne języki obsługują konstruktory statyczne właśnie w tym celu, C++ niestety nie jest jednym z nich.

Jeśli twoja zmienna statyczna może być zainicjowana bezpośrednio, nie jest potrzebny żaden konstruktor: możesz zdefiniować statyczną zmienną składową, nawet jeśli jest prywatna. Robimy to w powyższym przykładzie z s_nextID. Oto kolejny przykład:

class Something (publiczny: statyczny std :: wektor) s_mychary; ); std :: wektor Coś :: s_mychars = ("o", "a", "u", "i", "e"); // zdefiniuj statyczną zmienną składową

klasa coś

publiczny:

std statyczny :: wektor< char >s_mychary;

std :: wektor< char >Coś :: s_mychars = ("o", "a", "u", "i", "e"); // zdefiniuj statyczną zmienną składową

Jeśli potrzebujesz wykonać kod (np. pętlę), aby zainicjować swoją statyczną zmienną składową, możesz to zrobić na kilka sposobów. Następny sposób jest najlepszy:

#zawierać #zawierać class Something (prywatne: statyczne std :: wektor s_mychary; public: class _nested // zdefiniuj zagnieżdżoną klasę o nazwie _nested (public: _nested () // konstruktor _nested inicjalizuje naszą statyczną zmienną składową (s_mychars.push_back ("o"); s_mychars.push_back ("a")); s_mychars.push_back ("u"); s_mychars.push_back ("i"); s_mychars.push_back ("e");)); // Statyczna metoda wyprowadzania s_mychars static void getSomething() (for (auto const & element: s_mychars) std :: cout<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vectorCoś :: s_mychars; // zdefiniuj naszą statyczną zmienną składową Coś :: _ zagnieżdżone Coś :: s_initializer; // zdefiniuj nasz statyczny s_initializer, który wywoła konstruktor _nested w celu zainicjowania s_mychars int main() (Coś :: getSomething (); return 0;)

#zawierać

#zawierać

klasa coś

prywatny:

std statyczny :: wektor< char >s_mychary;

publiczny:

klasa _zagnieżdżona // zdefiniuj zagnieżdżoną klasę o nazwie _nested

publiczny:

Zagnieżdżone () // _zagnieżdżony konstruktor inicjuje naszą statyczną zmienną składową

s_mychary. push_back ("o");

s_mychary. push_back ("a");

s_mychary. push_back ("u");

s_mychary. push_back ("i");

s_mychary. push_back ("e");

Ostatnia aktualizacja: 08.10.2017

Oprócz zmiennych i metod, które odnoszą się bezpośrednio do obiektu, C++ umożliwia definiowanie zmiennych i metod, które odnoszą się bezpośrednio do klasy lub w inny sposób do statycznych elementów klasy. Zmienne i metody statyczne generalnie dotyczą całej klasy. Do ich zdefiniowania używane jest słowo kluczowe static.

Na przykład bank może mieć wiele różnych depozytów, ale wszystkie depozyty będą miały pewne wspólne oprocentowanie. Tak więc, aby opisać konto bankowe, definiujemy i stosujemy następującą klasę:

#zawierać class Account (public: Account (double sum) (this-> sum = sum;) static int getRate () (return rate;) static void setRate (int r) (rate = r;) double getIncome () (return sum + suma * stawka / 100;) prywatne: suma podwójna; statyczna stawka int;); wewn. Konto :: stawka = 8; int main () (Konto 1 (20000); Konto 2 (50000); Konto :: setRate (5); // zresetuj stawkę std :: cout<< "Rate: " << Account::getRate() << std::endl; std::cout << "Rate: " << account1.getRate() << " Income: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.getRate() << " Income: " << account2.getIncome() << std::endl; return 0; }

Klasa Account definiuje jedną statyczną zmienną stawkę i dwie statyczne funkcje do zarządzania tą zmienną. Przy definiowaniu funkcji statycznych należy pamiętać, że w ich wnętrzu możemy używać tylko statycznych zmiennych klas, takich jak zmienna szybkości. W funkcjach statycznych nie można używać zmiennych niestatycznych.

Ponadto wskaźnik ten nie może być stosowany w funkcjach statycznych, co w zasadzie jest już oczywiste, ponieważ wskazuje na bieżący obiekt, a funkcje statyczne odnoszą się jako całość do całej klasy.

Ważne jest również to, że jeśli klasa zawiera zmienne statyczne, to muszą być dodatkowo zdefiniowane poza klasą:

Konto wewnętrzne :: stawka = 8;

Opcjonalne jest przypisanie wartości początkowej do zmiennej.

Warto również zauważyć, że ponieważ elementy statyczne odnoszą się ogólnie do całej klasy, nazwa klasy jest używana w odniesieniu do elementów statycznych, po której następuje operator ::. Lub możemy również uzyskać dostęp do publicznych członków klasy poprzez zmienne tej klasy:

Konto :: getRate () account1.getRate ()

Wyjście konsoli programu:

Stawka: 5 Stawka: 5 Dochód: 21000 Stawka: 5 Dochód: 52500

W klasach często stosuje się również stałe statyczne. Na przykład ustawmy zmienną stawki jako stałą w klasie Konto:

#zawierać class Account (public: const static int rate = 8; Account (podwójna suma) (this-> sum = sum;) double getIncome () (suma zwrotu + suma * rate / 100;) private: suma podwójna;); int main () (Konto 1 (20000); Konto 2 (50000); std :: cout<< "Rate: " << account1.rate << "\tIncome: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.rate << "\tIncome: " << account2.getIncome() << std::endl; return 0; }

W przeciwieństwie do zmiennych statycznych, stałe statyczne nie muszą być dodatkowo definiowane poza klasą.

Lekcja 25. Funkcje statyczne i składowe danych

Do tej pory każdy tworzony obiekt miał swój własny zestaw elementów danych. W zależności od przeznaczenia aplikacji mogą wystąpić sytuacje, w których obiekty tej samej klasy muszą współdzielić jeden lub więcej elementów danych. Załóżmy na przykład, że piszesz program płatności, który śledzi godziny pracy 1000 pracowników. Aby ustalić stawkę podatku, program musi znać warunki, w jakich pracuje każdy pracownik. Niech zostanie do tego użyta zmienna klasy stan_pracy. Jeśli jednak wszyscy pracownicy pracują w tych samych warunkach, twój program może współdzielić ten element danych dla wszystkich obiektów typu pracownik. W ten sposób twój program zmniejsza ilość wymaganej pamięci, wyrzucając 999 kopii tych samych informacji. Aby udostępnić element klasy, musisz zadeklarować ten element jako statyczny (statyczny). Ten samouczek przeprowadzi Cię przez kroki, które musisz wykonać, aby udostępnić członka klasy z wieloma obiektami. Pod koniec tego samouczka opanujesz następujące podstawowe pojęcia:

    C++ pozwala na posiadanie obiektów tego samego typu, które współdzielą jednego lub więcej członków klasy.

    Jeśli twój program przypisuje wartość do współdzielonego elementu, wszystkie obiekty tej klasy natychmiast uzyskują dostęp do tej nowej wartości.

    Aby utworzyć współdzielonego członka klasy, musisz poprzedzić nazwę członka klasy słowem kluczowym statyczny.

    Po tym, jak program zadeklarował element klasy jako statyczny, musi zadeklarować zmienną globalną (poza definicją klasy), która odpowiada temu współdzielonemu członowi klasy.

    Twoje programy mogą używać słowa kluczowego statyczny, uczynić metodę klasy wywoływalną, podczas gdy program mógł jeszcze nie zadeklarować żadnych obiektów tej klasy.

UDOSTĘPNIANIE DANYCH

Zazwyczaj podczas tworzenia obiektów określonej klasy każdy obiekt otrzymuje swój własny zestaw elementów danych. Mogą jednak wystąpić sytuacje, w których obiekty tej samej klasy muszą współdzielić jeden lub więcej elementów danych. (statyczny e elementy danych). W takich przypadkach zadeklaruj pozycje jako wspólny szlam i prywatny, a następnie poprzedź typ słowem kluczowym statyczny, jak pokazano niżej:

prywatne: statyczne int shared_value;

Po zadeklarowaniu klasy należy zadeklarować element jako zmienną globalną poza klasą, jak pokazano poniżej:

int nazwa_klasy :: wartość_współdzielona;

Poniższy program SHARE_IT.CPP definiuje klasę seria książek, element współdzielenia Liczba stron, która jest taka sama dla wszystkich obiektów (książek) klasy (serii). Jeśli program zmieni wartość tego elementu, zmiana zostanie natychmiast odzwierciedlona we wszystkich obiektach klasy:

#zawierać

#zawierać

klasa_seria_książek

(publiczne: book_series (char *, char *, float); void show_book (void); void set_pages (int); prywatne: statyczna liczba stron int; tytuł znaku; autor znaku [64]; cena zmiennoprzecinkowa;);

int seria_książek :: liczba_stron;

void book_series :: set_pages (strony wewnętrzne)

(liczba_stron = strony;)

book_series :: book_series (znak * tytuł, znak * autor, cena zmiennoprzecinkowa)

(strcpy (seria_książki :: tytuł, tytuł); strcpy (seria_książki :: autor, autor); seria_książki :: cena = cena;)

void book_series :: show_book (nieważne)

(cout<< "Заголовок: " << title << endl; cout << "Автор: " << author << endl; cout << "Цена: " << price << endl; cout << "Страницы: " << page_count << endl; }

(programowanie book_series ("Nauka programowania w C++", "Jamsa", 22.95); book_series word ("Nauka pracy z Wordem dla Windows", "Wyatt", 19.95); word.set_pages (256); programowanie). show_book (); word.show_book (); cout<< endl << "Изменение page_count " << endl; programming.set_pages(512); programming.show_book(); word.show_book(); }

Jak widać, klasa deklaruje Liczba stron tak jak statyczny wewn. Natychmiast po zdefiniowaniu klasy program deklaruje element Liczba stron jako zmienna globalna. Gdy program zmienia element Liczba stron, zmiana natychmiast objawia się we wszystkich obiektach klasy seria książek.

Udostępnianie członków klasy

W zależności od programu mogą wystąpić sytuacje, w których konieczne będzie udostępnienie określonych danych w wielu instancjach obiektu. Aby to zrobić, zadeklaruj taki element jako statyczny. Następnie zadeklaruj ten element poza klasą jako zmienną globalną. Wszelkie zmiany wprowadzone przez program w tym elemencie zostaną natychmiast odzwierciedlone w obiektach tej klasy.

Używanie elementów z atrybutamipubliczne statyczne, jeśli obiekty nie istnieją

Jak się właśnie dowiedziałeś, deklarując element klasy jako statyczny ten element jest wspólny dla wszystkich obiektów tej klasy. Zdarzają się jednak sytuacje, gdy program nie utworzył jeszcze obiektu, ale musi użyć elementu. Aby użyć elementu, Twój program musi go zadeklarować jako publiczny i statyczny. Na przykład następujący program USE_MBR.CPP używa elementu Liczba stron z klasy seria książek, nawet jeśli obiekty tej klasy nie istnieją:

#zawierać

#zawierać

klasa_seria_książek

(publiczne: statyczne int liczba_stron; prywatne: tytuł znaku; autor znaku; cena zmiennoprzecinkowa;);

int seria_książek :: liczba_stron;

void main (void) (seria_książek :: liczba_stron = 256; cout<< "Текущее значение page_count равно " << book_series::page_count << endl; }

W tym przypadku, ponieważ klasa definiuje element klasy Liczba stron tak jak publiczny, program może odwoływać się do tego członka klasy, nawet jeśli obiekty klasy seria książek nie istnieje.

KORZYSTANIE Z FUNKCJI ELEMENTÓW STATYCZNYCH

Poprzedni program zilustrował zastosowanie statyczny elementy danych. Podobnie C++ pozwala zdefiniować statyczny funkcje składowe (metody). Jeśli tworzysz statyczny Twój program może wywołać taką metodę, nawet jeśli nie utworzono żadnych obiektów. Na przykład, jeśli klasa zawiera metodę, której można użyć na danych poza klasą, możesz zrobić tę metodę statyczny. Poniżej znajduje się klasa menu, który używa sekwencji esc sterownika ANSI do wyczyszczenia ekranu wyświetlacza. Jeśli masz zainstalowany sterownik ANSI.SYS w swoim systemie, możesz użyć metody czysty ekran do czyszczenia ekranu. Ponieważ ta metoda jest zadeklarowana jako statyczny, program może z niego korzystać, nawet jeśli obiekty typu menu nie istnieje. Poniższy program CLR_SCR.CPP używa metody czysty ekran aby wyczyścić ekran wyświetlacza:

#zawierać

(public: static void clear_screen (void); // Powinny być tutaj inne metody private: int number_of_menu_options;);

void menu :: wyczyść_ekran (unieważnij)

(cout<< "\033" << "}

DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz czytać Dzwon?
Bez spamu