13.x — Podsumowanie i quiz rozdziału 13

Gratulacje! Udało Ci się przejść przez kolejny. Zdobyta wiedza na temat struktur przyda się, gdy dotrzemy do najważniejszego tematu C++ – klas!

Szybki przegląd

A typ zdefiniowany przez program (zwana także typ zdefiniowany przez użytkownika) to typ niestandardowy, który możemy utworzyć do użytku w naszych własnych programach. Wymienione typy i typy klas (w tym struktury, klasy i związki) pozwalają na tworzenie typów zdefiniowanych w programie. Typy zdefiniowane w programie muszą zostać zdefiniowane, zanim będzie można ich użyć. Definicja typu zdefiniowanego w programie nazywana jest definicją typu. Definicje typów nie podlegają zasadzie jednej definicji.

An wyliczenie (zwany także typem wyliczeniowym lub wyliczeniem) to złożony typ danych, w którym każda możliwa wartość jest zdefiniowana jako stała symboliczna (tzw. licznik licznik). Wyliczenia są odrębnymi typami, co oznacza, że ​​kompilator może odróżnić je od innych typów (w przeciwieństwie do aliasów typów).

Wyliczenia bez zakresu nazywane są takimi, ponieważ umieszczają nazwy modułów wyliczających w tym samym zakresie, co sama definicja wyliczenia (w przeciwieństwie do tworzenia nowego regionu zakresu, jak ma to miejsce w przypadku przestrzeni nazw). Wyliczenia bez zakresu udostępniają również nazwany region zakresu dla swoich modułów wyliczających. Wyliczenia bez zakresu zostaną niejawnie przekonwertowane na wartości całkowite.

Wyliczenia o zakresie działają podobnie do wyliczeń bez zakresu, ale nie będą niejawnie konwertowane na liczby całkowite, a moduły wyliczające są tylko umieszczane w obszarze zakresu wyliczenia (a nie w regionie zasięgu, w którym znajduje się wyliczenie zdefiniowane).

A struct (skrót od structure) to zdefiniowany przez program typ danych, który pozwala nam połączyć wiele zmiennych w jeden typ. Zmienne będące częścią struktury (lub klasy) nazywane są elementami danych (lub zmiennymi składowymi). Aby uzyskać dostęp do określonej zmiennej składowej, używamy operatora wyboru elementu (operator.) pomiędzy nazwą zmiennej struktury a nazwą elementu składowego (w przypadku normalnych struktur i odniesień do struktur) lub wyboru elementów za pomocą operatora wskaźnika (operator->) (w przypadku wskaźników do struktur).

W ogólnym programowaniu zagregowany typ danych (zwany także agregatem) to dowolny typ, który może zawierać wiele elementów danych. W C++ tablice i struktury zawierające tylko elementy danych są agregatami.

Agregaty korzystają z formy inicjalizacji zwanej inicjowaniem agregatu, która pozwala nam bezpośrednio inicjować elementy agregatów. Aby to zrobić, jako inicjator podajemy lista inicjatorów , który jest po prostu listą wartości oddzielonych przecinkami. Inicjalizacja agregatowa wykonuje inicjalizację członową, co oznacza, że ​​każdy element członkowski struktury jest inicjowany w kolejności deklaracji.

W C++20 Wyznaczone inicjatory pozwalają jawnie zdefiniować, które wartości inicjujące są mapowane na które elementy. Elementy muszą zostać zainicjowane w kolejności, w jakiej zostały zadeklarowane w strukturze, w przeciwnym razie wystąpi błąd.

Gdy definiujemy typ struktury (lub klasy), możemy podać domyślną wartość inicjującą dla każdego elementu członkowskiego w ramach definicji typu. Proces ten nazywa się niestatyczną inicjalizacją elementu , a wartość inicjująca nazywa się domyślnym inicjatorem elementu.

Ze względu na wydajność kompilator czasami dodaje luki do struktur (nazywa się to dopełnianiem), więc rozmiar struktury może być większy niż suma rozmiarów jej elementów.

A Szablon klasy to definicja szablonu do tworzenia instancji typów klas (struktur, klas lub unii). Dedukcja argumentów szablonu klasy (CTAD) to funkcja C++17, która pozwala kompilatorowi wydedukować argumenty typu szablonu z inicjator.

Czas quizu

Tak!

Pytanie nr 1

Projektując grę, decydujemy, że chcemy mieć potwory, ponieważ każdy lubi walczyć z potworami. Zadeklaruj strukturę reprezentującą twojego potwora. Potwór powinien mieć jeden z następujących typów: ogr, smok, ork, gigantyczny pająk lub śluz.

Każdy pojedynczy potwór powinien mieć również nazwę (użyj std::string), a także ilość zdrowia reprezentującą, ile obrażeń może przyjąć, zanim umrze. Napisz funkcję o nazwie printMonster(), która wypisuje wszystkie elementy struktury. Utwórz instancję ogra i szlamu, zainicjuj je przy użyciu listy inicjatorów i przekaż je do printMonster().

Twój program powinien wygenerować następujące dane wyjściowe:

This Ogre is named Torg and has 145 health.
This Slime is named Blurp and has 23 health.

Pokaż rozwiązanie

Pytanie nr 2

Określ, czy obiekty każdego z podanych typów powinny być przekazywane przez wartość, stały adres czy odwołanie do stałej. Można założyć, że funkcja przyjmująca te typy jako parametry ich nie modyfikuje.

A) char

Pokaż rozwiązanie

B) std::string

Pokaż rozwiązanie

C) unsigned long

Pokaż rozwiązanie

D) bool

Pokaż rozwiązanie

e) Typ wyliczeniowy

Pokaż rozwiązanie

f)

struct Position
{
  double x{};
  double y{};
  double z{};
};

Pokaż rozwiązanie

g)

struct Player
{
  int health{};
  // The Player struct is still under development.  More members will be added.
};

Pokaż rozwiązanie

h) int (gdy null jest prawidłowym argumentem)

Pokaż rozwiązanie

i) std::string_view

Pokaż rozwiązanie

Pytanie nr 3

Utwórz szablon klasy o nazwie Triad który ma 3 elementy tego samego typu szablonu. Utwórz także szablon funkcji o nazwie print , który może wydrukować Triadę. Następujący program powinien się skompilować:

int main()
{
	Triad t1{ 1, 2, 3 }; // note: uses CTAD to deduce template arguments
	print(t1);

	Triad t2{ 1.2, 3.4, 5.6 }; // note: uses CTAD to deduce template arguments
	print(t2);

	return 0;
}

i dać następujący wynik:

[1, 2, 3][1.2, 3.4, 5.6]

Jeśli używasz C++17, będziesz musiał udostępnić przewodnik dedukcji, aby CTAD działał (zobacz 13.14 -- Przewodniki dedukcji i dedukcji szablonu klasy (CTAD) , aby uzyskać informacje na temat tamto).

Pokaż rozwiązanie

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
370 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze