Институт среднего профессионального образования
Е.А. Кураева
МЕТОДИЧЕСКИЕ УКАЗАНИЯ И ЗАДАНИЯ
ПО ВЫПОЛНЕНИЮ ДОМАШНЕЙ КОНТРОЛЬНОЙ РАБОТЫ
для студентов специальности
09.02.03 «Программировнаие в компьютерных системах»
ПО ДИСЦИПЛИНЕ «СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ»
Санкт-Петербург
2019/2020
СОДЕРЖАНИЕ
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ | |
ОФОРМЛЕНИЕ КОНТРОЛЬНОЙ РАБОТЫ | |
ВАРИАНТЫКОНТРОЛЬНЫХ РАБОТ | |
ЛИТЕРАТУРА | |
ОБРАЗЕЦ ТИТУЛЬНОГО ЛИСТА ДЛЯ КОНТРОЛЬНОЙ РАБОТЫ | |
Теоретические сведения
В соответствии с учебным планом, реализация индивидуальных заданий производится на языке С++.
C++ — компилируемый, статически типизированный язык программирования общего назначения.
Поддерживает такие парадигмы программирования, как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование. Язык имеет богатую стандартную библиотеку, которая включает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регулярные выражения, поддержку многопоточности и другие возможности. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков.В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.
C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также игр. Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.
|
Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.
Стандарт C++ состоит из двух основных частей: описание ядра языка и описание стандартной библиотеки.
Первое время язык развивался вне формальных рамок, спонтанно, по мере встававших перед ним задач. Развитию языка сопутствовало развитие кросс-компилятора cfront. Новшества в языке отражались в изменении номера версии кросс-компилятора. Эти номера версий кросс-компилятора распространялись и на сам язык, но применительно к настоящему времени речь о версиях языка C++ не ведут. Лишь в 1998 году язык стал стандартизированным.
C++ поддерживает как комментарии в стиле C (/* комментарий */), так и однострочные (// вся оставшаяся часть строки является комментарием), где // обозначает начало комментария, а ближайший последующий символ новой строки, который не предварён символом \ (либо эквивалентным ему обозначением??/), считается окончанием комментария. Плюс этого комментария в том, что его не обязательно заканчивать, то есть обозначать окончание комментария.
|
Спецификатор inline для функций. Функция, определённая внутри тела класса, является inline по умолчанию. Данный спецификатор является подсказкой компилятору и может встроить тело функции в код вместо её непосредственного вызова.
Квалификаторы const и volatile. В отличие от С, где const обозначает только доступ на чтение, в C++ переменная с квалификатором const должна быть инициализирована. volatile используется в описании переменных и информирует компилятор, что значение данной переменной может быть изменено способом, который компилятор не в состоянии отследить. Для переменных, объявленных volatile, компилятор не должен применять средства оптимизации, изменяющие положение переменной в памяти (например, помещающие её в регистр) или полагающиеся на неизменность значения переменной в промежутке между двумя присваиваниями ей значения. В многоядерной системе volatile помогает избегать барьеров памяти 2-го типа[источник не указан 2345 дней].
Пространства имён (namespace). Пример:
Namespace Foo
{
const int x=5;
}
const int y = Foo::x;
Специальным случаем является безымянное пространство имён. Все имена, описанные в нём, доступны только в текущей единице трансляции и имеют локальное связывание. Пространство имён std содержит в себе стандартные библиотеки C++.
Для работы с памятью введены операторы new, new[], delete и delete[]. В отличие от библиотечных malloc и free, пришедших из C, данные операторы производят инициализацию объекта. Для классов это вызов конструктора, для POD типов инициализацию можно либо не проводить(new Pod;), либо провести инициализацию нулевыми значениями (new Pod(); new Pod{};).
|
Типы
В C++ доступны следующие встроенные типы. Типы C++ практически полностью повторяют типы данных в C:
Символьные: char, wchar_t (char16_t и char32_t, в стандарте C++11).
Целочисленные знаковые: signed char, short int, int, long int (и long long, в стандарте C++11).
Целочисленные беззнаковые: unsigned char, unsigned short int, unsigned int, unsigned long int(и unsigned long long, в стандарте C++11).
С плавающей точкой: float, double, long double.
Логический: bool, имеющий значения true или false.
Операции сравнения возвращают тип bool. Выражения в скобках после if, while приводятся к типу bool.[13]
Язык ввёл понятие ссылок, а начиная с одиннадцатой версии стандарта rvalue-ссылки и передаваемые ссылки (англ. forwarding reference). (см. Ссылка (C++))
C++ добавляет к C объектно-ориентированные возможности. Он вводит классы, которые обеспечивают три самых важных свойства ООП: инкапсуляцию, наследование и полиморфизм.
В стандарте C++ под классом (class) подразумевается пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union, под структурой (structure) подразумевается класс, определённый через ключевое слово struct, и под объединением (union) подразумевается класс, определённый через ключевое слово union.
В теле определения класса можно указать как объявления функций, так и их определение. В последнем случае функция является встраиваемой (inline)). Нестатические функции-члены могут иметь квалификаторы const и volatile, а также ссылочный квалификатор (& или &&).
Наследование
C++ поддерживает множественное наследование. Базовые классы (классы-предки) указываются в заголовке описания класса, возможно, со спецификаторами доступа. Наследование от каждого класса может быть публичным, защищённым или закрытым:
По умолчанию базовый класс наследуется как private.
В результате наследования класс-потомок получает все поля классов-предков и все их методы; можно сказать, что каждый экземпляр класса-потомка содержит подэкземпляр каждого из классов-предков. Если один класс-предок наследуется несколько раз (это возможно, если он является предком нескольких базовых классов создаваемого класса), то экземпляры класса-потомка будет включать столько же подэкземпляров данного класса-предка. Чтобы избежать такого эффекта, если он нежелателен, C++ поддерживает концепцию виртуального наследования. При наследовании базовый класс может объявляться виртуальным; на все виртуальные вхождения класса-предка в дерево наследования класса-потомка в потомке создаётся только один подэкземпляр.
Полиморфизм
C++ поддерживает динамический полиморфизм и параметрический полиморфизм.
Параметрический полиморфизм представлен:
Аргументами по умолчанию для функций. К примеру, для функции void f(int x, int y=5, int z=10), вызовы f(1), f(1,5) и f(1,5,10) эквивалентны.
Перегрузка функций: функция с одним именем может иметь разное число и разные по типу аргументы. Например:
void Print(int x);
void Print(double x);
void Print(int x, int y);
Частным случаем перегрузки функций можно считать перегрузку операторов.
Механизмом шаблонов
Динамический полиморфизм реализуется с помощью виртуальных методов и иерархии наследования. Полиморфным в C++ является тип имеющий хотя бы один виртуальный метод. Пример иерархии:
Class Figure
{
public:
virtual void Draw() = 0; // чистый виртуальный метод
virtual ~Figure(); // при наличии хотя бы одного виртуального метода деструктор следует сделать виртуальным
};
class Square: public Figure
{
public:
void Draw() override;
};