Deklarowanie własnych typów

Kurs: Wstęp do programowania
Lekcja 4: Praca z różnymi typami danych
Temat 4: Deklarowanie własnych typów

⇓ spis treści ⇓


W programowaniu deklarowanie własnych typów danych to niezwykle ważna umiejętność, która pozwala tworzyć bardziej zrozumiały, zorganizowany i łatwiejszy do zarządzania kod. Własne typy danych są szczególnie przydatne, gdy standardowe typy danych, takie jak int, float czy char, nie są wystarczające do reprezentowania złożonych struktur informacji. W tej lekcji omówimy różne sposoby deklarowania własnych typów danych, takie jak typedef, enum oraz struct. Dowiesz się również, jak poprawnie używać tych konstrukcji, jakie są ich zalety oraz w jakich sytuacjach mogą się przydać.

Dlaczego warto deklarować własne typy danych?

Tworzenie własnych typów danych pozwala na lepszą organizację kodu i poprawia jego czytelność. Dzięki tej technice możesz nadać znaczenie danym, co ułatwia zrozumienie, do czego są używane. Na przykład zamiast używać typu int do przechowywania identyfikatora pracownika, możesz zdefiniować własny typ o nazwie EmployeeID, co sprawi, że kod stanie się bardziej zrozumiały dla innych programistów.

Użycie typedef do tworzenia aliasów typów

Jednym z najprostszych sposobów deklarowania własnych typów danych w C++ jest użycie słowa kluczowego typedef. typedef pozwala tworzyć aliasy dla istniejących typów danych, co może uprościć kod i uczynić go bardziej czytelnym.

Przykład użycia typedef
typedef unsigned long long int ULLI;
ULLI liczbaDuza = 123456789012345;

W powyższym przykładzie używamy typedef, aby utworzyć alias ULLI dla typu unsigned long long int. Dzięki temu kod staje się bardziej zwięzły i czytelny.

Ulepszone deklaracje typów w nowoczesnym C++

W nowoczesnych wersjach C++, takich jak C++11 i nowsze, zamiast typedef można używać słowa kluczowego using, które jest bardziej elastyczne i czytelne.

Przykład użycia using
using ULLI = unsigned long long int;
ULLI liczbaDuza = 123456789012345;

W tym przykładzie osiągamy ten sam efekt, co w przypadku typedef, ale składnia using jest bardziej przejrzysta, szczególnie gdy definiujemy złożone typy, takie jak wskaźniki do funkcji.

Tworzenie wyliczeń za pomocą enum

Enumeracje (ang. enumerations) to sposób definiowania własnych typów danych, które mogą przyjmować jedną z ograniczonego zestawu wartości. enum jest szczególnie przydatne, gdy chcemy zdefiniować zmienną, która może mieć tylko określone wartości, takie jak dni tygodnia, kierunki geograficzne czy stany gry.

Przykład użycia enum
enum DzienTygodnia { Poniedzialek, Wtorek, Sroda, Czwartek, Piatek, Sobota, Niedziela };
DzienTygodnia dzien = Sroda;

W tym przykładzie definiujemy wyliczenie DzienTygodnia, które może przyjmować jedną z siedmiu wartości. Dzięki temu możemy używać czytelnych nazw zamiast liczb całkowitych, co zwiększa czytelność kodu.

Wyliczenia w C++11 i nowszych

W C++11 wprowadzono enum class, które rozwiązuje wiele problemów związanych z tradycyjnymi wyliczeniami. enum class zapewnia lepszą kontrolę nad zakresem i typem wyliczenia.

Przykład użycia enum class
enum class Kolor { Czerwony, Zielony, Niebieski };
Kolor kolor = Kolor::Czerwony;

W przypadku enum class wartości muszą być poprzedzone nazwą wyliczenia, co zapobiega konfliktom nazw i zwiększa bezpieczeństwo typów.

Struktury danych: Ulepszanie organizacji danych

Struktury (ang. struct) są jednym z najważniejszych narzędzi do deklarowania własnych typów danych. Pozwalają one na grupowanie zmiennych różnych typów w jedną całość. Dzięki strukturom możemy modelować bardziej złożone obiekty, takie jak osoby, samochody czy zamówienia.

Przykład deklaracji struktury
struct Osoba {
    std::string imie;
    std::string nazwisko;
    int wiek;
};

W powyższym przykładzie definiujemy strukturę Osoba, która przechowuje imię, nazwisko i wiek osoby. Struktury umożliwiają przechowywanie i organizowanie danych w sposób bardziej logiczny i zrozumiały.

Typy unie: Oszczędne zarządzanie pamięcią

Unie to typ danych, który pozwala na przechowywanie kilku zmiennych różnych typów w tym samym miejscu w pamięci. Omówiliśmy je wcześniej, ale warto wspomnieć, że unie również można stosować do definiowania własnych typów, szczególnie gdy zależy nam na oszczędzaniu pamięci.

Przykład użycia unii
union Dane {
    int liczba;
    float liczbaZmiennoprzecinkowa;
    char znak;
};

W przypadku unii musimy pamiętać, że w danym momencie możemy przechowywać tylko jedną z wartości, co może być zarówno zaletą, jak i ograniczeniem.

Tworzenie aliasów dla struktur i unii

Możemy używać typedef lub using, aby tworzyć aliasy dla złożonych struktur i unii, co upraszcza kod i czyni go bardziej czytelnym.

Przykład tworzenia aliasu dla struktury
typedef struct {
    std::string marka;
    std::string model;
    int rokProdukcji;
} Samochod;

W tym przykładzie tworzymy alias Samochod dla struktury, która przechowuje informacje o samochodzie. Dzięki temu możemy łatwiej deklarować zmienne tego typu w naszym programie.

Praktyczne zastosowania własnych typów danych

Własne typy danych są szeroko stosowane w różnych dziedzinach programowania, od prostych aplikacji po złożone systemy. Oto kilka przykładów:

1. Modelowanie rzeczywistych obiektów

Własne typy danych są idealne do modelowania rzeczywistych obiektów, takich jak pracownicy, zamówienia czy produkty. Dzięki nim możemy łatwo zarządzać danymi i przechowywać je w bardziej zorganizowany sposób.

2. Tworzenie bibliotek i API

Własne typy danych są często używane w bibliotekach i API, aby ukryć szczegóły implementacyjne i ułatwić korzystanie z funkcji oraz klas.

3. Optymalizacja i zarządzanie pamięcią

Własne typy danych, takie jak unie, mogą być używane do optymalizacji pamięci w systemach wbudowanych i innych aplikacjach o ograniczonych zasobach.

Podsumowanie

Deklarowanie własnych typów danych to potężna technika, która pozwala tworzyć bardziej zrozumiałe, zorganizowane i efektywne programy. W tej lekcji nauczyłeś się, jak używać typedef i using do tworzenia aliasów, jak definiować enumeracje za pomocą enum i enum class, oraz jak używać struktur i unii do organizacji danych. Wiedza ta jest niezbędna do tworzenia bardziej złożonych i wydajnych aplikacji, które są łatwiejsze do utrzymania i rozwijania.

Następny temat ==> Zasady zgodności typów w programowaniu



Spis Treści - Wstęp do programowania

Lekcja 3: Rozwiązywanie problemów i poprawność programów Lekcja 4: Praca z różnymi typami danych Lekcja 5: Obsługa plików i pamięci Lekcja 6: Zaawansowane techniki programistyczne Lekcja 7: Wskaźniki i pamięć dynamiczna Lekcja 8: Struktura kodu i abstrakcja Lekcja 9: Rekurencja i jej zastosowania Lekcja 10: Analiza wydajności algorytmów Lekcja 11: Technika "dziel i zwyciężaj" Lekcja 12: Struktury danych o dynamicznej budowie Lekcja 13: Struktury hierarchiczne: Drzewa Lekcja 14: Struktury danych z bibliotek Lekcja 15: Algorytmy z nawrotami Lekcja 16: Programowanie dynamiczne Lekcja 17: Programowanie zachłanne Lekcja 18: Praca z grafami

Jeśli chciałbyś być poinformowany o następnych kursach to zapisz się do naszego newslettera: