Klasa 3 · rozdział 1

Powtórzenie i paradygmat obiektowy

Klasa 2 dała C++ od algorytmu do pierwszych klas. Tu ładujesz ten fundament i ustawiasz myślenie na cały rok: program to nie tylko ciąg funkcji — to obiekty, które mają dane i zachowanie. Pojęcia (klasa, obiekt, hermetyzacja) są też w słowniczku.

Po tym rozdziale powinieneś umieć

  • odróżnić program strukturalny (funkcje) od obiektowego (klasy);
  • przypomnieć pojęcia: klasa (wzór / szablon), obiekt (instancja), atrybut, metoda;
  • napisać krótki program z funkcją oraz prostą klasą w Visual Studio 2026;
  • porównać oba zapisy na tym samym zadaniu;
  • wymienić cechy języka obiektowego i przykładowe języki;
  • uzasadnić, kiedy warto wydzielić klasę, a kiedy wystarcza funkcja.

1. Powtórzenie: C++ strukturalny

W programie strukturalnym dzielisz zadanie na funkcje. Dane (zmienne, tablice, struktury) żyją osobno; funkcje je przyjmują i zwracają wynik. Wejście i wyjście trzymasz w main — obliczenie w funkcji bez cin / cout. Tę umowę z klasy 2 zostawiasz na cały rok i na zadanie praktyczne.

#include <iostream>
using namespace std;

double poleProstokata(double a, double b) {
    return a * b;
}

int main() {
    double a, b;
    cin >> a >> b;
    cout << poleProstokata(a, b);
    return 0;
}

Z klasy 2 musisz sprawnie wrócić do: typów (int, double, string), if / pętli, funkcji (wartość, referencja, void), tablic i wektorów, prostych plików tekstowych. Jeśli któraś konstrukcja zardzewiała — odtwórz ją w Visual Studio zanim ruszysz w głąb klas.

Stanowisko Nadal: aplikacja konsolowa C++ w Visual Studio 2026. Nowy projekt → ten sam układ: jeden plik .cpp na start, potem podział na klasy. Ten podręcznik tylko czytasz w przeglądarce.

2. Powtórzenie: klasy i obiekty

Klasa Wzór, szablon lub projekt do tworzenia obiektów. Definiuje atrybuty (zmienne) i zachowania (metody) dla każdego obiektu, który zostanie na jej podstawie utworzony.
Obiekt Konkretna instancja (egzemplarz) klasy. Obiekt posiada określone wartości dla zdefiniowanych w klasie atrybutów.

Klasa Prostokat jest szablonem: mówi, że każdy obiekt będzie miał atrybuty a i b oraz zachowania pole() i obwod(). Zapis Prostokat p(3, 4) tworzy instancję — ten obiekt ma już konkretne wartości atrybutów (3 i 4). Drugi obiekt Prostokat q(5, 2) korzysta z tego samego wzoru, ale ma własne wartości.

Pojęcie Znaczenie W przykładzie
Klasa Wzór, szablon, projekt do tworzenia obiektów Prostokat
Obiekt Instancja (egzemplarz) klasy — z własnymi wartościami atrybutów Prostokat p(3, 4);
Atrybut (pole) Zmienna zdefiniowana w klasie; w obiekcie ma konkretną wartość a, b
Metoda Zachowanie zdefiniowane w klasie pole(), obwod()
Konstruktor Metoda wołana przy tworzeniu instancji; ustawia atrybuty Prostokat(double, double)
class Prostokat {
    double a, b;
public:
    Prostokat(double aa, double bb) : a(aa), b(bb) {}
    double pole() const { return a * b; }
    double obwod() const { return 2 * (a + b); }
};

Atrybuty (pola) są private (domyślnie w class). Na zewnątrz wołasz metody, nie podstawiasz wartości a i b z main. To zalążek hermetyzacji — atrybuty i zasady ich zmiany zostają przy obiekcie. Dziedziczenie i polimorfizm z końca klasy 2 wrócą jako osobny, pełny dział.

Klasa to nie instancja Szablon nie ma jeszcze wartości atrybutów. Dopiero obiekt — konkretna instancja — posiada np. boki 3 i 4 i może wykonać metodę. Zdanie „klasa ma pole równe 3” jest nieprecyzyjne: ten obiekt ma atrybut równy 3.

3. Ten sam problem, dwa zapisy

Zadanie: wczytaj boki prostokąta, wypisz pole i obwód. Poniżej ta sama matematyka — inny podział odpowiedzialności.

Strukturalnie

Dwie funkcje biorą boki jako argumenty. Nic nie pamięta „tego” prostokąta między wywołaniami. Jeśli dołożysz przekątną, dopisujesz trzecią funkcję i znowu przekazujesz a i b.

Obiektowo

Obiekt trzyma boki. Metody nie potrzebują argumentów boków — liczą z pól. Drugi prostokąt to drugi obiekt, nie kolejna para zmiennych a2, b2.

// we/wy zostaje w main — tak w obu wariantach
int main() {
    double a, b;
    cin >> a >> b;

    Prostokat p(a, b);
    cout << p.pole() << " " << p.obwod();
    return 0;
}

Obiektowość nie zwalnia z czystego main. Nadal: odczyt, utworzenie obiektu, wypisanie tego, co metody policzyły. Funkcja-liczydło bez we/wy staje się metodą bez we/wy.

Mieszanka bez pomysłu Klasa z publicznymi polami i liczeniem w main to nadal program strukturalny w przebraniu. Jeśli wydzielasz klasę, stan i operacje na tym stanie idą do środka.

4. Paradygmat i języki obiektowe

Paradygmat to umowa, jak układasz program. Strukturalny: funkcje i dane. Obiektowy: obiekty, które łączą jedno i drugie i mogą tworzyć hierarchie.

Język obiektowy daje składnię na klasy, obiekty, zwykle hermetyzację i dziedziczenie. C++ jest wieloparadygmatowy: możesz pisać „jak w C” albo obiektowo. Na tym przedmiocie świadomie wybierasz drugi sposób, gdy zadanie ma stan i zachowania.

Język Uwaga na start
C++ Kompilowany. Klasy, dziedziczenie, później szablony. Nasz język na sali.
C# Klasy od pierwszej linijki. Typowy przy aplikacjach na Windows / .NET.
Java Prawie wszystko jest klasą. Maszyna wirtualna, inny ekosystem niż C++.
Python Interpretowany; klasy są, ale nie musisz ich używać w każdym skrypcie.

Wspólny szkielet idei: klasa, obiekt, hermetyzacja, dziedziczenie. Składnia i szczegóły (wskaźniki, destruktor, virtual) są już „po C++”. Nie uczysz się tu Javy — wystarczy rozpoznać, że to ten sam paradygmat.

5. Kiedy klasa, kiedy funkcja

Nie każda linijka zasługuje na klasę. Funkcja zostaje, gdy liczysz coś z argumentów i nic nie musisz pamiętać do następnego wywołania: NWD, minimum z tablicy, zamiana stopni.

Klasę warto wydzielić, gdy:

  • kilka danych należy do siebie (bok i bok; saldo i numer konta);
  • te dane mają stały zestaw operacji (wpłata, wypłata; pole, obwód);
  • będzie więcej niż jeden egzemplarz (lista produktów, kilku uczniów);
  • potem pojawi się hierarchia (Pojazd → Samochod) — to już zapowiedź kolejnych działów.
Szkic przed kodem Zanim otworzysz Visual Studio, zapisz na kartce: jakie klasy, jakie pola, jakie metody, kto z kim rozmawia. Jeśli nie umiesz nazwać odpowiedzialności klasy jednym zdaniem — za wcześnie na plik .cpp.

6. Szkic aplikacji obiektowej

Przykład: wypożyczalnia podręczników. Nie implementujesz jej w tym rozdziale — ćwiczysz podział.

Klasa Odpowiedzialność Przykładowe składowe
Ksiazka Jeden egzemplarz tytuł, dostępna, wypozycz(), zwroc()
Czytelnik Osoba z limitem wypożyczeń imię, ile ma książek, mozeWziac()
Wypozyczalnia Zbiór książek i reguła wypożyczenia lista książek, znajdz(), obsluz()

main tylko wczytuje polecenie i woła metody. NWD albo sortowanie listy inwentarzowej zostaje funkcją / metodą bez we/wy — nie robi się z nich osobnej „klasy dla samego faktu”.

Mieszany kod Gdy widzisz main ze zmiennymi tytul1, tytul2 i funkcjami wypozycz1(), wypozycz2(), to sygnał: te powtórzenia powinny stać się obiektami jednej klasy.

Ćwiczenia do samodzielnego wykonania

Folder: np. Dokumenty\cwiczenia-po\klasa-3\rozdzial-01. Programy kompilujesz w Visual Studio 2026. Nie trzymaj prac w folderze podręcznika.

Ćwiczenie 1. Języki i paradygmat łatwe

W notatce: (1) jednym zdaniem różnica programu strukturalnego i obiektowego; (2) cztery języki obiektowe z rozdziału; (3) który z nich jest na tych zajęciach i dlaczego nazywamy go wieloparadygmatowym.

Ćwiczenie 2. Podpisz składowe łatwe

Skopiuj klasę Prostokat z rozdziału. Przy każdej linii dopisz komentarz: klasa (szablon) / atrybut / konstruktor / metoda / instancja (instancję tworzysz w main, który dopiszesz). Uruchom program dla boków 3 i 4 (pole 12, obwód 14).

Ćwiczenie 3. Klasa według wzoru łatwe

Klasa Uczen: pola imię i średnia, konstruktor, metoda czyOtrzymujeStypendium() — prawda, gdy średnia ≥ 4.75. W main wczytaj dane jednego ucznia i wypisz tak/nie. We/wy tylko w main.

Ćwiczenie 4. Dwa zapisy średnie

Zadanie: temperatura w Celsjuszach → Fahrenheity oraz komunikat „mróz”, gdy C < 0. Najpierw wersja z funkcjami, potem klasa Temperatura z polem i dwiema metodami. W komentarzu na górze pliku: co się stało z daną „stopnie” po przejściu na obiekt.

F = 1.8 * C + 32. Funkcje biorą c jako argument. W klasie c jest polem; metody nie powtarzają tego argumentu.

Ćwiczenie 5. Cechy języka obiektowego średnie

Własnymi słowami (akapit, nie tabela): klasy, hermetyzacja, dziedziczenie — co dają programiście. Podaj jeden przykład spoza C++ (Java, C# albo Python) i napisz, czy na sali ten język kompilujesz. Nie kopiuj tabeli z rozdziału.

Ćwiczenie 6. Klasa czy funkcja średnie

Dla każdego punktu: „klasa” albo „funkcja” + jedno zdanie uzasadnienia:

  1. NWD dwóch liczb całkowitych;
  2. konto bankowe (numer, saldo, wpłata, wypłata);
  3. sprawdzenie, czy rok jest przestępny;
  4. trzy produkty w koszyku, każdy z nazwą i ceną.

Ćwiczenie 7. Szkic, nie kod trudne

Wybierz: sklep (produkt, koszyk) albo dziennik (uczeń, przedmiot, ocena). Na kartce albo w pliku tekstowym: 2–4 klasy, pola, metody, jedno zdanie odpowiedzialności na klasę. Zaznacz, co zostaje zwykłą funkcją (np. średnia z tablicy ocen). Nie pisz jeszcze pełnego C++.

Ćwiczenie 8. Kod mieszany trudne

Masz taki szkic (możesz go wpisać i uruchomić, potem poprawić):

string tytul1 = "Pan Tadeusz", tytul2 = "Lalka";
bool wolna1 = true, wolna2 = true;

void wypozyczPierwsza() { wolna1 = false; }
void wypozyczDruga() { wolna2 = false; }

Zaproponuj spójny podział obiektowy (jakie klasy, co znika z globalnych zmiennych). Zaimplementuj jedną klasę Ksiazka i pokaż dwa obiekty zamiast indeksów 1 i 2.

Sprawdź się

1. Czym program obiektowy różni się od strukturalnego?
2. Co jest obiektem?
3. Który zestaw to języki obiektowe wymienione w rozdziale?
4. Po co ukrywać pola (hermetyzacja) w prostej klasie?
5. Kiedy raczej zostawisz zwykłą funkcję zamiast klasy?

Wymagania na ocenę

Ocena wyższa zawiera wymagania na oceny niższe. Dotyczy powtórzenia i paradygmatu obiektowego.

Ocena Uczeń
2 Rozróżnia program strukturalny (funkcje) i obiektowy (klasy). Wymienia przykładowe języki obiektowe (C++, C#, Java, Python).
3 Przypomina definicję klasy (wzór / szablon), obiektu (instancja), atrybutu i metody. Pisze krótki program z funkcją i prostą klasą według wzoru.
4 Porównuje paradygmat strukturalny z obiektowym na tym samym zadaniu. Charakteryzuje cechy języka obiektowego (klasy, dziedziczenie, hermetyzacja).
5 Uzasadnia, kiedy warto wydzielić klasę, a kiedy wystarcza funkcja. Projektuje aplikację obiektową na poziomie szkicu (klasy i odpowiedzialności).
6 Analizuje gotowy kod mieszany i proponuje spójny podział obiektowy.

Lista „już umiem”