Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы Осадчий А.В. гр.010902.docx
Скачиваний:
9
Добавлен:
24.04.2019
Размер:
143.34 Кб
Скачать

Ответил на вопросы по КПиЯП ОСАДЧИЙ АЛЕКСАНДР ВИТАЛЬЕВИЧ , ФКП,ИПОИТ,гр.010902.

1. Основные типы данных, объявление пользовательских типов данных typedef

В языке C++ можно использовать 5 основных типов данных void, int, float, double и char

К целочисленным типам относятся типы, представленные следующими именами основных типов:

  • сhar(символьный)

  • Int (целочисленный тип)

К типам с плавающей запятой относятся 2 типа, представленные следующими именами типов, модификаторов и их сочетаний:

  • float (с плавающей запятой)

  • double(с плавающей запятой,двойной точности)

  • long double(с плавающей запятой и двойной точности)

Можно использовать модификаторы типа:

signed(знаковый)

unsigned(беззнаковый)

short(укороченная версия типа)

long(удлиненная версия типа)

Так же есть типы : bool и wchar_t.

  • bool (логический)

  • wchar_t(символьный расширенный)

Директива typedef

С помощью директивы typedef мы можем задать синоним для встроенного либо пользовательского типа данных.

Пример:

typedef double wages;

typedef vector<int> vec_int;

typedef vec_int test_scores;

typedef bool in_attendance;

typedef int *Pint;

Имена, определенные с помощью директивы typedef, можно использовать точно так же, как спецификаторы типов:

// double hourly, weekly;

wages hourly, weekly;

// vector<int> vecl( 10 );

vec_int vecl( 10 );

// vector<int> test0( c1ass_size );

const int c1ass_size = 34;

test_scores test0( c1ass_size );

// vector< bool > attendance;

vector< in_attendance > attendance( c1ass_size );

// int *table[ 10 ];

Pint table [ 10 ];

Эта директива начинается с ключевого слова typedef, за которым идет спецификатор типа, и заканчивается идентификатором, который становится синонимом для указанного типа.

2. Основные директивы препроцессора. Макросы

Макросы в языке программирования Си преимущественно используются для определения небольших фрагментов кода. Во время обработки кода препроцессором, каждый макрос заменяется соответствующим ему определением. Если макрос имеет параметры, то они указываются в теле макроса; таким образом, макросы языка Си могут походить на Си-функции. Распространенная причина использования — избежание накладных расходов при вызове функции в простейших случаях, когда небольшого кода, вызываемого функцией, достаточно для ощутимого снижения производительности.

#define max(a,b) ((a) > (b) ? (a) : (b))

z = max(x,y); -> z = ((x) > (y) ? (x) : (y));

Директивы препроцессора представляют собой инструкции, записанные в тексте программы на С, и выполняемые до трансляции программы. Директивы препроцессора позволяют изменить текст программы, например, заменить некоторые лексемы в тексте, вставить текст из другого файла, запретить трансляцию части текста и т.п. Все директивы препроцессора начинаются со знака #. После директив препроцессора точка с запятой не ставятся. Директива #INCLUDE включает в текст программы содержимое указанного файла. Эта директива имеет 2 формы #INCLUDE "ИМЯ ФАЙЛА" #INCLUDE <ИМЯ ФАЙЛА>

3. Указатели и динамическая память

Указатели являются одной из сильных сторон С++.Если размер объекта или массива заранее неизвестен (например, изображение), или размер объекта слишком большой, чтобы создавать его внутри функции, значит настало время воспользоваться механизмом динамической памяти С++, использующую отдельную область памяти называемой кучей.

Для этого нам необходимо знать всего два оператора:

  • new - выделение памяти, если выделение памяти не произошло возвращается нулевой указатель;

  • delete - освобождение памяти, не во всех компиляторах после освобождения памяти указателю присваивается 0.

Грамотное применение указателей позволяет повысить скорость выполнения программы и более эффективно использовать память. Например, во многих случаях в качестве аргументов функции лучше использовать указатели на объект, чем каждый раз создавать их копии.

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

& - взятие адреса переменной;

* - разъименование указателя, т.е. получение доступа к объекту;

-> - разъименование члена структуры;

[] - индексация, доступ к элементу массива, при этом считается, что указатель содержит адрес 0 элемента.

Операция индексации может быть реализована с помощью адресной арифметики, где применяются операции ++,--, и +, -.

Можно создавать указатели на любые типы за исключением ссылок и битовых полей. Указатель может указывать не только на данные, но и на область кода, т.е. на функцию.