W lekcji 4.1 -- Wprowadzenie do podstawowych typów danych wprowadziliśmy podstawowe typy danych, które są podstawowymi typami danych udostępnianymi przez C++ jako część rdzenia języka.
Do tej pory często korzystaliśmy z tych podstawowych typów w naszych programach, zwłaszcza typu danych int . I chociaż te podstawowe typy są niezwykle przydatne w prostych zastosowaniach, nie pokrywają pełnego zakresu naszych potrzeb, gdy zaczynamy robić bardziej skomplikowane rzeczy.
Wyobraźmy sobie na przykład, że piszesz program matematyczny do mnożenia dwóch ułamków zwykłych. Jak reprezentowałbyś ułamek w swoim programie? Możesz użyć pary liczb całkowitych (jednej dla licznika, drugiej dla mianownika), na przykład:
#include <iostream>
int main()
{
// Our first fraction
int num1 {};
int den1 {};
// Our second fraction
int num2 {};
int den2 {};
// Used to eat (remove) the slash between the numerator and denominator
char ignore {};
std::cout << "Enter a fraction: ";
std::cin >> num1 >> ignore >> den1;
std::cout << "Enter a fraction: ";
std::cin >> num2 >> ignore >> den2;
std::cout << "The two fractions multiplied: "
<< num1 * num2 << '/' << den1 * den2 << '\n';
return 0;
}I wykonanie tego programu:
Enter a fraction: 1/2 Enter a fraction: 3/4 The two fractions multiplied: 3/8
Gdy ten program działa, wprowadza on kilka wyzwań, które możemy ulepszyć. Po pierwsze, każda para liczb całkowitych jest ze sobą luźno powiązana — poza komentarzami i kontekstem ich użycia w kodzie niewiele wskazuje na to, że każda para liczników i mianowników jest ze sobą powiązana. Po drugie, zgodnie z zasadą DRY (nie powtarzaj się), powinniśmy stworzyć funkcję, która obsłuży użytkownika wprowadzającego ułamek (wraz z obsługą błędów). Jednak funkcje mogą zwracać tylko jedną wartość, więc jak zwrócić licznik i mianownik z powrotem do wywołującego?
Wyobraźmy sobie teraz inny przypadek, w którym piszesz program, który musi przechowywać listę identyfikatorów pracowników. Jak możesz to zrobić? Możesz spróbować czegoś takiego:
int main()
{
int id1 { 42 };
int id2 { 57 };
int id3 { 162 };
// and so on
}Ale co by było, gdybyś miał 100 pracowników? Najpierw musisz wpisać 100 nazw zmiennych. A co jeśli trzeba będzie wydrukować je wszystkie? Lub przekazać je do funkcji? Będziemy musieli dużo pisać. To po prostu nie da się skalować.
Bez wątpienia typy podstawowe zaprowadzą nas tylko do tej pory.
Złożone typy danych
Na szczęście C++ obsługuje drugi zestaw typów danych: złożone typy danych (czasami nazywane złożone typy danych) to typy zdefiniowane w kategoriach innych istniejących typów danych. Złożone typy danych mają dodatkowe właściwości i zachowania, dzięki którym są przydatne do rozwiązywania określonych typów problemów.
Kluczowa informacja
Każdy typ danych jest albo typem podstawowym, albo typem złożonym. Standard języka C++ wyraźnie definiuje, do której kategorii należy każdy typ.
Jak pokażemy w tym rozdziale i w przyszłych rozdziałach, możemy używać złożonych typów danych, aby elegancko rozwiązać wszystkie problemy przedstawione powyżej.
C++ obsługuje następujące typy złożone:
- Funkcje
- Tablice w stylu C
- Wskaźnik typy:
- Wskaźnik na obiekt
- Wskaźnik na funkcję
- Wskaźnik na typy prętów:
- Wskaźnik na element danych
- Wskaźnik na funkcję elementu
- Typy referencyjne:
- Odniesienia do wartości L
- Wartość R referencje
- Typy wyliczeniowe:
- Wyliczenia bez zakresu
- Wyliczenia o zakresie
- Typy klas:
- Struktury
- Klasy
- Unie
Używałeś już regularnie jednego typu złożonego: funkcji. Rozważmy na przykład tę funkcję:
void doSomething(int x, double y)
{
}Typ tej funkcji to void(int, double). Należy zauważyć, że ten typ składa się z typów podstawowych, co czyni go typem złożonym. Oczywiście funkcje również mają swoje własne, specjalne zachowania (np. są wywoływalne).
Ponieważ jest tu dużo materiału do omówienia, zajmiemy się tym w kilku rozdziałach. W tym rozdziale omówimy niektóre prostsze typy złożone, w tym l-value references, I pointers. W następnym rozdziale omówimy unscoped enumerations, scoped enumerations i nasz pierwszy typ klasy: structs. Następnie w kolejnych rozdziałach przedstawimy klasy i przyjrzymy się niektórym z bardziej przydatnych array typów. Obejmuje to std::string (przedstawione w lekcji 5.7 — Wprowadzenie do std::string), który w rzeczywistości jest typem klasy!
Nomenklatura
A typ klasy to typ będący strukturą, klasą lub unią. Będziemy często używać tego terminu na przyszłych lekcjach.
Czy jesteś gotowy na grę? Do dzieła!

