C++/Czym jest obiekt: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
→‎Kontrola dostępu: Ulogicznienie przykładu. Powiązanie z poprzednią częścią artykułu.
Lethern (dyskusja | edycje)
revert - nadal deklaracja nie jest tu odpowiednim słowem!
Linia 48:
 
== Użycie klasy ==
Sama deklaracjadefinicja klasy nie wystarczy, aby uzyskać dostęp do jej składowych. Należy stworzyć obiekt. WMożna tenprzyjąć, sposóbże powstajeobiekt nowato zmienna, którejtypu typ jest zdefiniowany jako klasaklasowego. Jest to o tyle istotne, że podczas tworzeniaDeklaracja obiektu jest mu fizycznie przydzielana pamięć, oraz przydzielany jest adres własny tego obiektu (dostępny przez użycie operatora '''this''').:
Deklaracja obiektu:
<source lang="cpp">NazwaKlasy Obiekt;</source>
 
Dostęp do wybranych pól i metod uzyskuje się operatorem ('''.'''):
<source lang="cpp">
Obiekt.poleInt = 0;//przypisanie wartości polom
Linia 61 ⟶ 60:
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ę '''->''':
<source lang="cpp">
ObiektWsk->poleInt = 0; //przypisanie wartości polom
Linia 68 ⟶ 67:
</source>
 
Należy pamiętać o zniszczeniu obiektu przed zakończeniem działania programu, (lub co ważniejsze, kiedy nie jest nam już potrzebny):
<source lang="cpp">
delete ObiektWsk;
</source>
Zwolnienie pamięci jest bardzo istotne w przypadku dużych programów, kiedy to wykorzystujemy dużą obiektów tworzonych dynamicznie. Jeśli nie będziemy usuwać nieużywanych obiektów, to dojdzie do wycieku pamięci.
 
=== Przykład ===
Linia 82 ⟶ 80:
unsigned int maks;
void Losuj();
void Wypisz();
};
</source>
 
Po deklaracjidefinicji klasy, zdefiniujmy jeszcze metodę ''Losuj()'' zadeklarowaną w tej klasie:
<source lang="cpp">
void Kostka::Losuj()
Linia 93 ⟶ 90:
}
</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.
Poza tym aby uzyskać dostęp do pól klasy, w zakresie definicji metody tej klasy nie ma potrzeby stosowania operatora wyboru pola, a można traktować je jak uprzednio zadeklarowane zmienne (gdyż tak właśnie jest - są deklarowane wewnątrz deklaracji klasy). Żeby jednak być pewnym, że zyskujemy dostęp do atrybutu obiektu, a nie jakiejkolwiek innej zmiennej można odwołać się do niej jawnie poprzez użycie operatora '''this'''. Zapiszemy więc alternatywną wersję funkcji Losuj() w ten sposób:
 
<source lang="cpp">
void Kostka::Losuj()
{
this->wartosc = rand() % (this->maks) + 1;
}
</source>
 
Proces taki zwiększa objętość kodu, jednak w wielu przypadkach pozwala uniknąć błędów, bądź zaoszczędzić czas podczas ich wyszukiwania. Jest dobrym nawykiem aby w przypadku nawet średnio skomplikowanych funkcji, jeśli występuję jakieś zmienne pomocnicze, do atrybutów obiektów odwoływać się poprzez ich indywidualny wskaźnik '''this'''.
Istotą działania wskaźnika jest to, że w każdym wywołaniu metody danej klasy '''this''' zawiera wskazanie na obiekt, na rzecz którego metoda ma być wykonana. Nic nie stoi na przeszkodzie, aby wywoływać w ten sposób również metody:
 
<source lang="cpp">
void Kostka::Losuj()
{
this->wartosc = rand() % (this->maks) + 1;
this->wypisz(); //inną metodę można wywołać tak
cout << "Zadowala cie ten wynik? ";
string ans="Tak";
cin >> ans;
if (ans == "Nie")
this->losuj(); //a nawet tak
 
void Kostka::Wypisz()
{
cout << "Wylosowano:" << kostkaSzescienna.wartosc << endl;
}
</source>
 
Po tym można napisać resztę programu, już w oparciu o zdefiniowane metody:
<source lang="cpp">
int main()
Linia 131 ⟶ 100:
kostkaSzescienna.maks = 6; //określenie maksymalnej ilosci oczek
kostkaSzescienna.Losuj(); //losowanie
cout << endl"Wylosowano:" << "Ostatecznie wylosowano:"kostkaSzescienna.wartosc << endl;//wypisanie wyniku
kostkaSzescienna.Wypisz();
return 0;
}