Инициализация int a=6; int mas[] = {1, 2, 3}; int mas[][5]={1, 2, 3}; char* st = “abc”; char* st[4] ={‘a’, ’b’, ’c’, 0};
Типы данных определяемые пользователем enum [имя_типа]{список констант}; enum color {red, green, blue}; struct [имя_типа]{ тип_1 элемент_1; … }[список описателей]; имя_типа или список описателей
struct { char f 1 o[30]; int date, code; double salary; }staff[100], *ps; struct worker { char f 1 o[30]; int date, code; double salary; }; worker staff[100]; для доступа к полям структуры используется. или -> при обращения через указатель staff[1]. date; ps->date;
union = struct, но все поля расположены по одному адресу и в один момент времени хранится только один элемент typedef можно использовать и для собственных типов
Модульное программирование
Функции [класс] тип имя ([список параметров])[throw(иск-я)] {тело функции} модификатор класс extern – глобальная видимость во всех модулях программы(по умолчанию) static – видимость только в пределах модуля
• Глобальные переменные – Видны во всех функциях, где не описаны локальные переменные с теми же именами – это плохо • Возвращаемое значение return[выражение]; – может содержать несколько операторов
Параметры функции • По значению – в стек заносятся копии значений • По адресу – в стек заносятся копии адресов void f(int i, int* j, int &k); f(I, &j, k); Следует указывать const перед параметрами не требующими изменения
Передача массивов • Всегда по адресу • Нет информации о длине • При передаче строки конец можно определить по ноль символу
Передача имени функции в качестве параметров • Определение функции void f(int a); • Определение указателя функции void (*r)(int); • Присвоение указателю функции r=&f; Вызов функции через указатель r(16);
• Для читабельности используем переименование типов typedef void (*r)(int); • Теперь r – тип и можно делать так r menu[] = {&new, &open, &save); menu[1](10); Вызов функции open //new, open, save объявлены ранее
Передача функции в функцию void f 2(r fun){ fun(10); return; };
Параметры по умолчанию • Параметры по умолчанию указываются последними int f(int a, int b = 100); f(10); или f(10, 15);
Рекурсия • Функция вызывает саму себя int fun(&a){ int b=5; fun(b); };
Перегрузка функций int max(int, int); char* max(char*, char*); Должны: • Находится в одной области видимости • При использовании параметров по умолчанию, они должны совпадать во всех вариантах • Не перегружаются если описание параметров отличается модификатором const или ссылкой( например int или int&)
Шаблоны template
main() • тип main(){} • Тип main(int argc, char* argv[]){} – argc определяет количество параметров передаваемых в функцию, включая имя самой программы – каждый элемент указатель на параметр командной строки
Директивы #include <имя файла> #include “имя файла” Во втором случае поиск ведётся сначала в текущем каталоге, а потом в каталогах по умолчанию #define имя текст_подстановки #define n. Max 1000 #define max(x, y) ((x)>(y)? (x): (y)) #define sqr(x) (x*x) Обращение sqr(y+1) подстановка (y+1*y+1)
#if Version == 1 #define INCFILE “vers 1. h” #elif Version == 2 #define INCFILE “vers 2. h” #else #define INCFILE “vers. N. h” #endif #include INCFILE
#undef #ifndef забыть заданный ранее макрос проверяет объявлен ли макрос #ifndef _file 1 #include “file 1. h” #define _file 1 #endif
Область действия идентификаторов • • • Блок Файл Функция/Шаблон функции Класс Поименованная область
Внешние объявления • Функция видна во всех модулях программы – Если надо ограничить область видимости одним файлом используется модификатор static • Переменная или константа доступна в нескольких модулях надо: – Определить её ровно в одном модуле как глобальную – В других модулях объявить её как внешнюю с помощью extern
Способ лучше! //my_header. h extern int a; extern double b; //one. cpp #include ”my_header. h”
Поименованные области namespace demo{ int i=1; int k= 0; void fun 1(int); void fun 2(int){} } namecpace demo{ int i=5; //неверно – двойное определение void fun 1(double); //Перегрузка void fun 2(int); //Повторное объявление
Подключение и использование void demo: : fun 1(int){} demo: : i=100; using demo: : i; using namespace demo; Нельзя подключить то, что не описано!
Обработка ошибок чтения/записи int foef(File*) возвращает не равное нулю значение, если достигнут конец файла, иначе 0 Int ferror(File*) Возвращает не равное нулю значение, если обнаружена ошибка ввода/вывода
Вопросы?


