Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тельнов по билетам.docx
Скачиваний:
5
Добавлен:
07.04.2023
Размер:
3.61 Mб
Скачать

XI билет)

1)Язык Си: Препроцессор. Директивы препоцессора. Примеры.

Препроцессор - текстовый процессор, который просматривает

исходный текст до компиляции и решает три задачи:

обрабатывает символические имена;

отыскивает и вставляет файлы;

осуществляет условную компиляцию.

Директивы #define и #undef

формат: #define <имя> <текст>

#define <имя> (<список-параметров>) <текст> // это макрос

#undef <имя>

примеры:

#define LENGTH 80

#define ABS(X) ((X) > 0 ? (x): -(x))

#define MAX (x, y) ((x) > (y) ? (x) : (y))

Зачем нужны скобки? Потому что возможны побочные эффекты, например

#define MAX(a, b + c) (a > b + c ? a : b +c)

#define ABS(++p) (++p > 0 ? ++p: -++p)

Директива #include

формат: #include <имя-пути>

#include “имя-пути”

примеры:

#include <iostream> // ищет файл в стандартных директориях

#include “c:file1.h” // ищет файл в конкретной директории

#include “file2.h” // ищет файл в текущей директории

Условная компиляция реализуется с помощью следующих директив:

#if #elif #else #endif defined undef

формат: #if <константное-выражение-1> [<текст-1>]

[ #elif <константное-выражение-2> [<текст-2>]]

[ #elif <константное-выражение-3> [<текст-3>]]

……………………………………………………..

[ #else [<текст-n>]]

#endif

Такие конструкции часто используются при инсталляции и настройке программных продуктов

пример:

#if (sizeof(void*) == 2) # define _SMALL_

#elif (sizeof(void*) == 4) # define _LARGE_ // модель памяти

#else printf(“?”);

#endif

пример:

#if (defined(_SMALL_) && undef(_LARGE_))

#include “file.h”

#endif

Популярные макросы для работы с символами находятся в файле <ctype.h>:

isalpha(c) - символ есть буква?

isdigit(c) - символ есть цифра?

isalnum(c) - символ есть буква или цифра?

isspace(c) - пробельный символ(пробелы, табуляция, перводы строки)?

islower(c) - символ нижнего регистра?

isupper(c) - символ верхнего регистра?

…………………………………………………..

2)Множественное наследование. Виртуальная схема наследования. Пример.

Множественное наследование означает, что у классов-потомков может быть более, чем один непосредственный класс-предок. В С++ такое допускается. Рассмотрим некоторый визуальный объект, который представляет собой текстовую строку, заключенную в окружность. Построим схему наследования:

Поскольку классы-потомки наследуют все данные и методы классов-предков, в итоге имеем следующую картину:

П оскольку классы-потомки наследуют все данные и методы классов-предков, в итоге имеем следующую картину:

В результате такой схемы наследования, все данные и методы класса TLocation будут представлены в итоговом классе Text_in_Circle в двух экземплярах.

Возникает неоднозначность: каким экземпляром данных пользоваться?

Данная неприятная ситуация преодолевается в С++ путем применения виртуальной схемы наследования (о ней позже).

3)Шаблоны Функций и шаблоны классов. Примеры.

Шаблоны функций и шаблоны классов есть дальнейшее развитие идеи макросов и перегруженных функций.

Шаблоны позволяют создавать параметризованные семейства функций и классов. Рассмотрим их использование на примерах.

Пример:

Шаблон функции для обмена значений объектов произвольных классов

#include <stdio.h>

//опишем шаблон функции _swap

template <class T> void _swap ( T& a, T& b ) { T temp = a; a = b; b = temp; }

//протестируем работу шаблона функции _swap

void main ( void ){

int n = 0, m = 1;

float x = 0., y =1.;

char *s1 = “one”, *s2 = “two”;

_swap( n, m ); //обменяем значения объектов типа Int

_swap( х. у): //обменяем значения объектов типа float

_swap( s1. 52 ): //обменяем значения объектов типа char*

printf(“%i %f %s\n”, n, x, s1); //посмотрим результаты работы

} //шаблона функции _swap