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:
<sourcesyntaxhighlight lang="cpp">
class NaszaNazwaKlasy {
... // pola i metody składowe klasy
};
</sourcesyntaxhighlight>
 
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:
 
<sourcesyntaxhighlight lang="cpp">
class NazwaKlasy {
public: //pola i metody są publicznie dostępne
Linia 45:
 
}; //pamiętaj o średniku!
</syntaxhighlight>
</source>
 
== 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:
<sourcesyntaxhighlight lang="cpp">NazwaKlasy Obiekt;</sourcesyntaxhighlight>
 
Dostęp do pól i metod uzyskuje się operatorem ('''.'''):
<sourcesyntaxhighlight lang="cpp">
Obiekt.poleInt = 0;//przypisanie wartości polom
Obiekt.poleFloat = 9.04;
Obiekt.Metoda1();//wywołanie metody obiektu
</syntaxhighlight>
</source>
 
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ę '''->''':
<sourcesyntaxhighlight lang="cpp">
ObiektWsk->poleInt = 0; //przypisanie wartości polom
ObiektWsk->poleFloat = 9.04;
ObiektWsk->Metoda1(); //wywołanie metody obiektu
</syntaxhighlight>
</source>
 
Należy pamiętać o zniszczeniu obiektu przed zakończeniem działania programu (lub kiedy nie jest nam już potrzebny):
<sourcesyntaxhighlight lang="cpp">
delete ObiektWsk;
</syntaxhighlight>
</source>
 
=== Przykład ===
Stwórzmy klasę kostki do gry:
<sourcesyntaxhighlight lang="cpp">
class Kostka{
public:
Linia 81:
void Losuj();
};
</syntaxhighlight>
</source>
 
Po definicji klasy, zdefiniujmy jeszcze metodę ''Losuj()'' zadeklarowaną w tej klasie:
<sourcesyntaxhighlight lang="cpp">
void Kostka::Losuj()
{
wartosc = rand()%maks + 1;
}
</syntaxhighlight>
</source>
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:
<sourcesyntaxhighlight lang="cpp">
int main()
{
Linia 103:
return 0;
}
</syntaxhighlight>
</source>
 
== 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'':
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
using namespace std;
Linia 128:
return 0;
}
</syntaxhighlight>
</source>
 
== 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:
<sourcesyntaxhighlight lang="cpp">
class Kostka{
public :
Linia 164:
max = argMax;
}
</syntaxhighlight>
</source>
 
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().