Języki Programowania – Zajęcia 5
Klasy i obiekty – pola i metody
Dzisiaj poznamy klasy i obiekty w C++. Nauczymy się tworzyć własne typy danych, przechowywać informacje w polach oraz wykonywać operacje za pomocą metod. Omówimy też, jak kontrolować dostęp do danych przy użyciu public i private.
1. Czym jest klasa i obiekt?
Klasa definiuje własny typ danych. Opisuje, jakie informacje obiekt przechowuje oraz jakie operacje można na nich wykonać. Obiekt jest konkretnym egzemplarzem klasy.
class Punkt {
public:
double x;
double y;
};
Klasa Punkt opisuje punkt o współrzędnych x i y. Średnik po zamykającej klamrze jest wymagany.
Obiekty utworzone na podstawie klasy można przekazywać do funkcji jako argumenty, podobnie jak zwykłe zmienne.
Punkt p1;
Punkt p2;
p1.x = 2.5;
p1.y = 4.0;
p2.x = -1.0;
p2.y = 3.0;
cout << p1.x << ", " << p1.y << endl;
cout << p2.x << ", " << p2.y << endl;
Każdy obiekt ma własne wartości pól. Zmiana p1.x nie zmienia wartości p2.x.
2. Pola klasy
Pola to zmienne zadeklarowane w klasie. Przechowują informacje opisujące obiekt. Mogą mieć różne typy, np. int, double, bool oraz string.
class Osoba {
public:
string imie;
int wiek;
double wzrost;
bool aktywna;
};
W tym przykładzie obiekt klasy Osoba może przechowywać imię, wiek, wzrost i informację logiczną. Na początku pola są publiczne, aby pokazać podstawowy sposób dostępu.
Ćwiczenie 1 – klasa Samochod
Utwórz klasę Samochod, która będzie przechowywać
podstawowe informacje o samochodzie. Na tym etapie nie pisz
własnych konstruktorów.
-
Dodaj pola
markaimodeltypustring. -
Dodaj pole
rokProdukcjitypuintoraz poleprzebiegtypudouble. -
Utwórz obiekt klasy
Samochodw funkcjimain(). - Przypisz polom przykładowe wartości.
- Wypisz wszystkie informacje o samochodzie na ekranie.
3. Metody klasy
Metoda to funkcja należąca do klasy. Zwykłą metodę wywołujemy na obiekcie tej klasy. Może ona korzystać z pól tego konkretnego obiektu i zmieniać ich wartości, jeśli pozwala na to jej definicja.
#include <iostream>
using namespace std;
class Punkt {
public:
double x;
double y;
void przesun(double dx, double dy) {
x += dx;
y += dy;
}
void wypisz() {
cout << x << ", " << y << endl;
}
};
int main() {
Punkt p1;
p1.x = 0;
p1.y = 0;
Punkt p2;
p2.x = 10;
p2.y = 10;
p1.przesun(2, 3);
p1.wypisz(); // 2, 3
p2.wypisz(); // 10, 10
}
Metoda przesun() zmienia współrzędne obiektu, na którym została wywołana. W tym przykładzie zmienia p1, ale nie zmienia p2.
3.1. Metoda zwracająca wynik
Metoda może zwracać wartość tak jak zwykła funkcja. Typ przed nazwą metody określa, jaki wynik zwraca.
class Punkt {
public:
double x;
double y;
double roznica() {
return ( x-y );
}
};
Punkt p;
p.x = 4;
p.y = 3;
cout << p.roznica(); // 1
3.2. Wskaźnik this
W zwykłej, niestatycznej metodzie dostępny jest wskaźnik this, który wskazuje na obiekt, na którym aktualnie wykonuje się metoda. Przydaje się m.in. wtedy, gdy parametr i pole mają tę samą nazwę.
class Punkt {
private:
double x;
public:
void ustawX(double x) {
this->x = x;
}
};
this->x oznacza pole bieżącego obiektu, a samo x oznacza parametr metody. Operator -> służy do dostępu do składowych za pomocą wskaźnika.
4. Dostęp do pól i metod: public i private
Poziomy dostępu określają, z których miejsc programu można korzystać z elementów klasy.
public– element można wykorzystywać spoza klasy.private– element jest dostępny bezpośrednio wewnątrz metod tej klasy, ale nie spoza niej.
W klasie elementy są domyślnie prywatne. Pola prywatne pomagają chronić dane przed przypadkową lub niepoprawną zmianą. Dostęp do nich można udostępniać przez publiczne metody.
class Ksiazka {
private:
string tytul = "brak";
string autor = "brak";
int liczbaStron = 0;
public:
void ustawDane(string t, string a, int strony) {
tytul = t;
autor = a;
liczbaStron = strony;
}
void wypisz() {
cout << "Tytul: " << tytul << endl;
cout << "Autor: " << autor << endl;
cout << "Liczba stron: " << liczbaStron << endl;
}
};
Ksiazka k;
k.ustawDane("Hobbit", "J.R.R. Tolkien", 310);
k.wypisz();
Wynik:
Tytul: Hobbit
Autor: J.R.R. Tolkien
Liczba stron: 310
Nie możemy bezpośrednio zmienić pola, np. k.tytul = "Hobbit";,
ponieważ jest ono prywatne (private). Zamiast tego korzystamy
z publicznej metody ustawDane(), która zapisuje informacje
o książce. Metoda wypisz() pozwala wyświetlić dane obiektu.
4.1. Gettery i settery
Getter to metoda zwracająca wartość pola, często nazwana getNazwa(). Setter to metoda ustawiająca wartość pola, często nazwana setNazwa(). Settery mogą również od razu sprawdzać, czy nowa wartość jest poprawna.
class Produkt {
private:
double cena = 0.0;
public:
double getCena() const {
return cena;
}
void setCena(double nowaCena) {
if (nowaCena >= 0) {
cena = nowaCena;
}
}
};
Metoda getCena() odczytuje cenę, a setCena() zmienia ją tylko wtedy, gdy wartość nie jest ujemna. Słowo const przy getterze oznacza, że metoda nie zmienia stanu obiektu.
Ćwiczenie 2 – pola prywatne i metody
Zadanie 1. – klasa Prostopadloscian
Utwórz klasę Prostopadloscian, która opisuje prostopadłościan o bokach równoległych do osi układu współrzędnych. Na tych zajęciach skupiamy się na polach, metodach i przekazywaniu obiektów do funkcji — nie pisz jeszcze własnych konstruktorów.
- Dodaj prywatne pola
dlugosc,szerokosciwysokosctypudouble. - Dodaj metodę
ustawWymiary(), która pozwoli jednocześnie ustawić wszystkie trzy wymiary. - Dodaj gettery pozwalające odczytać każdy z wymiarów.
- Dodaj metodę
objetosc(), która zwraca objętość prostopadłościanu. - Dodaj metodę
polePowierzchni(), która zwraca pole powierzchni całkowitej prostopadłościanu. - Dodaj metodę
wypisz(), która wyświetli wymiary, objętość i pole powierzchni. - Utwórz dwa obiekty klasy
Prostopadloscian, ustaw im różne wymiary i wyświetl ich dane. - Napisz funkcję
wiekszaObjetosc(), która przyjmuje dwa obiekty klasyProstopadlosciani zwraca ten, który ma większą objętość. Przetestuj ją dla utworzonych wcześniej obiektów. - Sprawdź, czy zmiana wymiarów jednego obiektu wpływa na drugi.
Zadanie 2. – klasa Punkt3D i wierzchołki
Utwórz klasę Punkt3D, która opisuje punkt w przestrzeni trójwymiarowej. Dodaj do niej trzy publiczne pola typu double: x, y i z.
Dodaj do klasy Prostopadloscian metodę wierzcholki(), która zwraca wektor ośmiu obiektów klasy Punkt3D, reprezentujących wierzchołki prostopadłościanu.
Przykładowa deklaracja metody:
vector<Punkt3D> wierzcholki() const;
Przyjmij następujące założenia:
- jeden z wierzchołków prostopadłościanu znajduje się w punkcie
(0, 0, 0), - krawędzie prostopadłościanu są równoległe do osi układu współrzędnych,
- wszystkie wymiary są dodatnie,
- wierzchołki powinny być zwracane w kolejności, w której najpierw podajesz cztery wierzchołki dolnej podstawy, a następnie cztery odpowiadające im wierzchołki górnej podstawy.
W rozwiązaniu wykorzystaj bibliotekę <vector>.
Na koniec napisz funkcję, która przyjmuje wektor punktów i wyświetla współrzędne wszystkich jego elementów. Wykorzystaj ją do wyświetlenia wierzchołków utworzonego wcześniej prostopadłościanu.
Zadanie 3. – odległości między wierzchołkami
Rozbuduj program o funkcję analizującą krawędzie prostopadłościanu.
-
Napisz metodę
odleglosc(), która należy do klasyPunkt3Di oblicza odległość między danym punktem a punktem przekazanym jako argument.Przykładowa deklaracja:
double odleglosc(const Punkt3D& p) const; - Napisz funkcję
znajdzNajdalszyWierzcholek(), która przyjmuje wektor punktów i zwraca największą odległość pomiędzy punktem(0, 0, 0)a dowolnym wierzchołkiem z tego wektora. - Wykorzystaj tę funkcję do obliczenia długości najdłuższej przekątnej prostopadłościanu.
- Porównaj otrzymany wynik z wartością obliczoną bezpośrednio na podstawie wymiarów prostopadłościanu.
Dodatkowe zadanie – klasa Trojkat
Utwórz klasę Trojkat, która przechowuje trzy
wierzchołki: A, B i C,
każdy typu Punkt.
Dodaj metodę ustawWierzcholki(), która przyjmuje
trzy obiekty klasy Punkt i ustawia wierzchołki
trójkąta.
Dodaj metodę obliczającą odległość między dwoma punktami.
Wykorzystaj wzór na odległość punktów o współrzędnych
(x1, y1) i (x2, y2):
Na tej podstawie wyznacz długości boków:
AB, BC oraz CA.
Dodaj metodę obwod(), która zwraca sumę długości
wszystkich boków.
Dodaj metodę pole(), która oblicza pole trójkąta
za pomocą wzoru Herona.
Do obliczania pierwiastka kwadratowego wykorzystaj funkcję
sqrt() z biblioteki <cmath>.
Dodaj trzy metody:
wysokoscAB(), wysokoscBC() i
wysokoscCA(). Każda z nich powinna zwracać wysokość
opuszczoną z odpowiedniego wierzchołka na przeciwległy bok.
Wypisz długości boków, pole, obwód oraz wszystkie trzy wysokości.
5. Najważniejsze informacje
- Klasa opisuje nowy typ danych, a obiekt jest konkretnym egzemplarzem tej klasy.
- Pola przechowują dane obiektu, a metody wykonują na nich operacje.
- Zwykłą metodę wywołujemy na konkretnym obiekcie, np.
p.wypisz(). publicudostępnia elementy spoza klasy, aprivateje ukrywa.- Gettery odczytują wartości, a settery umożliwiają ich kontrolowaną zmianę.
thiswskazuje obiekt, na którym wykonywana jest metoda.
Punktacja
| Punkty | Kryterium oceny |
|---|---|
| 0.5 pkt | Ćwiczenie 1 + 2 |
| 0.5 pkt |
Zadanie 1.1-2
Poprawna deklaracja klasy Prostopadloscian,
prywatnych pól dlugosc, szerokosc
i wysokosc oraz metody ustawWymiary().
|
| 0.5 pkt |
Zadanie 1.3-5
Poprawne gettery oraz metody objetosc()
i polePowierzchni().
|
| 0.5 pkt |
Zadanie 1.6-7
Poprawna metoda wypisz() oraz utworzenie
dwóch obiektów o różnych wymiarach i wyświetlenie ich danych.
|
| 0.5 pkt |
Zadanie 1.8-9
Poprawna funkcja wiekszaObjetosc(),
sprawdzenie jej działania oraz wykazanie niezależności
danych poszczególnych obiektów.
|
| 0.5 pkt |
Zadanie 2.1
Poprawna deklaracja klasy Punkt3D
z trzema polami opisującymi współrzędne punktu.
|
| 1.0 pkt |
Zadanie 2.2
Poprawna metoda wierzcholki(), która zwraca
wektor ośmiu obiektów klasy Punkt3D
o prawidłowych współrzędnych i w ustalonej kolejności.
|
| 0.5 pkt | Zadanie 2.3 Poprawna funkcja przyjmująca wektor punktów i wyświetlająca współrzędne wszystkich jego elementów. |
| 0.5 pkt |
Zadanie 3.1
Poprawna metoda odleglosc() klasy
Punkt3D, obliczająca odległość między
dwoma punktami w przestrzeni trójwymiarowej.
|
| 0.5 pkt |
Zadanie 3.2-4
Poprawna funkcja znajdzNajdalszyWierzcholek(),
wykorzystanie jej do obliczenia długości przekątnej
prostopadłościanu i porównanie wyniku z obliczeniem
bezpośrednim.
|
| 0.5 pkt |
Zadanie dodatkowe
|