7.x — Podsumowanie i quiz rozdziału 7

Przegląd rozdziału

W tym rozdziale omówiliśmy wiele materiałów. Dobra robota, radzisz sobie świetnie!

A oświadczenie złożone lub blok to grupa zerowa lub więcej instrukcji traktowana przez kompilator tak, jakby była pojedynczą instrukcją. Bloki zaczynają się od a { symbol, koniec na a } symbol, pomiędzy którymi znajdują się instrukcje do wykonania. Bloków można używać wszędzie tam, gdzie dozwolona jest pojedyncza instrukcja. Na końcu bloku nie jest potrzebny średnik. Bloki są często używane w połączeniu z if statements aby wykonać wiele instrukcji.

Przestrzenie nazw zdefiniowane przez użytkownika to przestrzenie nazw zdefiniowane przez Ciebie dla własnych deklaracji. Przestrzenie nazw udostępniane przez C++ (takie jak global namespace) lub przez biblioteki (takie jak namespace std) nie są uważane za przestrzenie nazw zdefiniowane przez użytkownika.

Dostęp do deklaracji w przestrzeni nazw można uzyskać za pomocą metody operator rozdzielczości zakresu (::). Operator rozpoznawania zakresu informuje kompilator, że identyfikatora określonego przez prawy operand należy szukać w zakresie lewego operandu. Jeśli nie podano żadnego operandu po lewej stronie, zakładana jest globalna przestrzeń nazw.

Zmienne lokalne to zmienne zdefiniowane w ramach funkcji (w tym parametry funkcji). Zmienne lokalne mają zakres bloku, co oznacza, że ​​znajdują się w zakresie od punktu definicji do końca bloku, w którym są zdefiniowane. Zmienne lokalne mają automatyczny czas przechowywania, co oznacza, że ​​są tworzone w momencie definicji i niszczone na końcu bloku, w którym są zdefiniowane.

Nazwa zadeklarowana w bloku zagnieżdżonym może cień lub ukryj nazwę zmienna o identycznej nazwie w bloku zewnętrznym. Należy tego unikać.

Zmienne globalne to zmienne zdefiniowane poza funkcją. Zmienne globalne mają zakres pliku, co oznacza, że ​​są widoczne od momentu deklaracji aż do końca pliku, w którym są zadeklarowane. Zmienne globalne mają czas statyczny, co oznacza, że ​​są tworzone podczas uruchamiania programu i niszczone po jego zakończeniu. Jeśli to możliwe, unikaj dynamicznej inicjalizacji zmiennych statycznych.

Identyfikator połączenie określa, czy inne deklaracje tej nazwy odnoszą się do tego samego obiektu, czy nie. Zmienne lokalne nie mają żadnego powiązania. Identyfikatory z powiązanie wewnętrzne można zobaczyć i używać w ramach jednego pliku, ale nie są one dostępne z poziomu innych plików. Identyfikatory z powiązanie zewnętrzne można zobaczyć i używać zarówno z pliku, w którym są zdefiniowane, jak i z innych plików kodu (poprzez deklarację forward).

Jeśli to możliwe, unikaj zmiennych globalnych innych niż stałe. Wartości globalne Const są ogólnie postrzegane jako akceptowalne. Używać zmienne wbudowane dla stałych globalnych, jeśli twój kompilator obsługuje C++ 17.

Zmienne lokalne mogą mieć statyczny czas trwania poprzez statyczny słowo kluczowe.

A kwalifikowana nazwa to nazwa zawierająca powiązany zakres (np. std::string). Jakiś niekwalifikowana nazwa to nazwa, która nie zawiera kwalifikatora zakresu (np. string).

Używanie stwierdzeń (w tym za pomocą deklaracji i za pomocą dyrektyw) można zastosować, aby uniknąć konieczności kwalifikowania identyfikatorów za pomocą jawnej przestrzeni nazw. A za pomocą deklaracji pozwala nam używać nazwy niekwalifikowanej (bez zakresu) jako aliasu nazwy kwalifikowanej. A za pomocą dyrektywy importuje wszystkie identyfikatory z przestrzeni nazw do zakresu dyrektywy using. Generalnie należy unikać jednego i drugiego.

Rozwijanie inline to proces, w którym wywołanie funkcji zostaje zastąpione kodem z definicji wywoływanej funkcji. Funkcja zadeklarowana przy użyciu słowa kluczowego inline nazywana jest funkcją wstawianą.

Funkcje i zmienne wbudowane mają dwa podstawowe wymagania:

  • Kompilator musi być w stanie zobaczyć pełną definicję funkcji lub zmiennej wstawianej w każdej jednostce tłumaczenia, w której funkcja jest używana (sama deklaracja forward nie wystarczy). Definicja może wystąpić po punkcie użycia, jeśli dostarczona jest również deklaracja forward.
  • Każda definicja funkcji lub zmiennej wbudowanej musi być identyczna, w przeciwnym razie spowoduje to niezdefiniowane zachowanie.

We współczesnym C++ termin inline ewoluował i oznacza „dozwolonych jest wiele definicji”. Zatem funkcja wbudowana to taka, którą można zdefiniować w wielu plikach. W C++17 wprowadzono zmienne wbudowane, które są zmiennymi, które można definiować w wielu plikach.

Funkcje i zmienne wbudowane są szczególnie przydatne w bibliotekach zawierających tylko nagłówek, które są jednym lub większą liczbą plików nagłówkowych implementujących pewne możliwości (nie są dostępne żadne pliki .cpp w zestawie).

W końcu C++ obsługuje nienazwane przestrzenie nazw, które w sposób dorozumiany traktują całą zawartość przestrzeni nazw tak, jakby miała wewnętrzne powiązania. C++ obsługuje także wbudowane przestrzenie nazw, które zapewniają pewne prymitywne możliwości wersjonowania przestrzeni nazw.

Czas quizu

Pytanie nr 1

Napraw następujący program:

#include <iostream>

int main()
{
	std::cout << "Enter a positive number: ";
	int num{};
	std::cin >> num;


	if (num < 0)
		std::cout << "Negative number entered.  Making positive.\n";
		num = -num;

	std::cout << "You entered: " << num;

	return 0;
}

Pokaż rozwiązanie

Pytanie nr 2

Napisz plik o nazwie stałych.h, który spowoduje uruchomienie następującego programu. Jeśli Twój kompilator obsługuje C++ 17, użyj wbudowanej zmiennej constexpr. W przeciwnym razie użyj zwykłej zmiennej constexpr. maxClassSize powinna mieć wartość 35.

main.cpp:

#include "constants.h"
#include <iostream>

int main()
{
	std::cout << "How many students are in your class? ";
	int students{};
	std::cin >> students;


	if (students > Constants::maxClassSize)
		std::cout << "There are too many students in this class";
	else
		std::cout << "This class isn't too large";

	return 0;
}

Pokaż rozwiązanie

Pytanie nr 3

Napisz funkcję int accumulate(int x). Funkcja ta powinna zwrócić sumę wszystkich wartości x , które zostały przekazane do tej funkcji.

Pokaż wskazówkę

Następujący program powinien zostać uruchomiony i wygenerować wynik opisany w komentarzach:

#include <iostream>

int main()
{
    std::cout << accumulate(4) << '\n'; // prints 4
    std::cout << accumulate(3) << '\n'; // prints 7
    std::cout << accumulate(2) << '\n'; // prints 9
    std::cout << accumulate(1) << '\n'; // prints 10

    return 0;
}

Pokaż rozwiązanie

3b) Dodatkowy kredyt: Jakie są dwie wady funkcji accumulate() powyżej?

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:  
552 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze