C++/Czym jest obiekt: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m poprawienia listy ćwiczeń |
Nie podano opisu zmian |
||
Linia 20:
== Definicja klasy ==
Ogólny szablon definiowania klas w C++ wygląda następująco:
<
class NaszaNazwaKlasy {
... // pola i metody składowe klasy
};
</
Po słowie kluczowym '''class''' następuje nazwa naszej klasy (prawidła jej nazywania są takie same jak dla zmiennych). <br>
Linia 32:
Oto przykładowa definicja klasy:
<
class NazwaKlasy {
public: //pola i metody są publicznie dostępne
Linia 45:
}; //pamiętaj o średniku!
</syntaxhighlight>
== Użycie klasy ==
Sama definicja klasy nie wystarczy, aby uzyskać dostęp do jej składowych. Należy stworzyć obiekt. Można przyjąć, że obiekt to zmienna typu klasowego. Deklaracja obiektu:
<
Dostęp do pól i metod uzyskuje się operatorem ('''.'''):
<
Obiekt.poleInt = 0;//przypisanie wartości polom
Obiekt.poleFloat = 9.04;
Obiekt.Metoda1();//wywołanie metody obiektu
</syntaxhighlight>
W przypadku deklaracji wskaźnika do obiektu:
<pre class="lang-cpp">NazwaKlasy *ObiektWsk = new NazwaKlasy;</pre>
Analogicznie jak w przypadku wskaźników na struktury operatorem dostępu do pola/metody klasy poprzez wskaźnik do obiektu staje się '''->''':
<
ObiektWsk->poleInt = 0; //przypisanie wartości polom
ObiektWsk->poleFloat = 9.04;
ObiektWsk->Metoda1(); //wywołanie metody obiektu
</syntaxhighlight>
Należy pamiętać o zniszczeniu obiektu przed zakończeniem działania programu (lub kiedy nie jest nam już potrzebny):
<
delete ObiektWsk;
</syntaxhighlight>
=== Przykład ===
Stwórzmy klasę kostki do gry:
<
class Kostka{
public:
Linia 81:
void Losuj();
};
</syntaxhighlight>
Po definicji klasy, zdefiniujmy jeszcze metodę ''Losuj()'' zadeklarowaną w tej klasie:
<
void Kostka::Losuj()
{
wartosc = rand()%maks + 1;
}
</syntaxhighlight>
Warto zwrócić uwagę, w jaki sposób się to robi. Nazwą metody dowolnej klasy jest ''NazwaKlasy::NazwaMetody''.
Poza tym aby uzyskać dostęp do pól klasy, w której istnieje dana metoda nie stosuje się operatora wyłuskania.
Po tym można napisać resztę programu:
<
int main()
{
Linia 103:
return 0;
}
</syntaxhighlight>
== Autorekursja ==
Linia 109:
Wskaźnik '''this''' umożliwia jawne odwołanie się zarówno do atrybutów, jak i metod klasy. Poniższy program wymusza użycie wskaźnika ''this'', gdyż nazwa pola jest taka sama jak nazwa argumentu metody ''wczytaj'':
<
#include <iostream>
using namespace std;
Linia 128:
return 0;
}
</syntaxhighlight>
== Kontrola dostępu ==
Linia 140:
Dzięki specyfikatorom dostępu inni programiści mają ułatwione korzystanie z utworzonej przez nas klasy, gdyż metody i pola, których nie powinni modyfikować, bo mogłoby to spowodować niepoprawne działanie obiektu, są oznaczone jako private lub protected i nie mogą z nich korzystać. Funkcje, które zapewniają pełną funkcjonalność klasy oznaczone są jako public i tylko do nich ma dostęp użytkownik klasy (do protected również, ale z ograniczeniami). Oto zmodyfikowany przykład z kostką, który zobrazuje cele kontroli dostępu:
<
class Kostka{
public :
Linia 164:
max = argMax;
}
</syntaxhighlight>
Zmodyfikowana klasa zezwala tylko na kostki maksymalnie dwudziestościenne. Ręczne modyfikacje zmiennej max są zabronione, można tego dokonać jedynie poprzez funkcję ZmienIloscScian, która zapobiega przydzieleniu większej ilości ścianek niż 20. Prywatny jest też atrybut wartość. Przecież nie chcemy aby była ona ustawiona inaczej niż przez losowanie! Dlatego możemy udostępnić jej wartość do odczytu poprzez metodę DajWartosc(), ale modyfikowana może być tylko na skutek działania metody Losuj().
|