Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по титп.doc
Скачиваний:
9
Добавлен:
24.09.2019
Размер:
249.86 Кб
Скачать

Ключевое слово const и функция

Объявление параметров в теле функции с ключевым словом const обеспечивает не изменение объекта из тела функции

Параметр: либо ссылка, либо указатель.

void func (const char*pc);

main()

{

func («1234»);

}

void func (const char *pc)

{

*pc=’A’ // нельзя изменять, ошибка!

}

Замечание: при объявлении константных параметров ключевое слово const должно фигурировать как в объявлении функции, так и в определении.

«Перегрузка» имен функции

Одной из особенностей языка С является возможность перегрузки имен функции, т.е. использование одного и того же имени для разных функций. Иногда такой подход бывает очень удобен, когда функции выполняют одинаковые по смыслу действия. Компилятор различает такие функции по числу и типу параметров.

int maxint (int x, int y);

{

return(x>y)?x:y;

}

double maxdouble (double x, double y);

{

return (x>y)?x:y;

}

main()

{

int i=maxint (2,5);

double d=maxdouble (3.14, 2.718);

}

2.

int max (int x, int y)

{

return (x>y)?x:y;

}

doublemax (double x, double y)

{

return (x>y)?x:y;

}

main()

{

int i=max(2,5);

double d= max (3.14, 2.718);

double dd=max(3.14,9); // будет ошибка, компилятор не будет знать, какую функцию запускать

}

Правильнее: double dd=max(3.14,static_cast<double>(9));

Возможные конфликты при использовании перегрузки и параметров по умолчанию:

void f (int x, int y=0);

void f (int x);

main()

{

f(1,5);

f(4);

}

Рекурсивные функции

Это функции, вызывающие сами себя.

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

Достоинства: компактность кода

Недостатки: увеличивает временные затраты, затраты в памяти

Специфика рекурсивных функций:

1) Необходимость обеспечения выхода

2) Желательно не использовать в функции локальные переменные, так как они забивают память

Факториал:

1 вариант:

int f(int x);

if (!x)

return 1

return x*f(x-1);

}

2 вариант:

int f(int x);

{

int a=1;

for(int i=2; i<x+1; i++)

a *=1;

return a;

}

Несмотря на большие затраты, преимущество начинает сказываться при работе со сложными структурами данных – деревьями, стеками.

Структуры c

В большом количестве случаев удобно обращаться к совокупности переменных, как к одному объекту. Логично такие переменные объединить.

Структуры языка C – это удобное средство для укрупнения данных. Объявление структуры – это описание компилятору шаблона, по которому он будет создавать объекты данного типа. При объявлении память не выделяется.

Struct имя_пользоват_типа

{

список полей структуры

};

struct ORC

{

char lname[30];

bool sexy;

int age

};

Создание объектов

Происходит так же, как создание переменной базового типа.

ORC Valentin;

Присваивание значения посредством оператора «.»

strcpy(Valentin.lname, «Rogkov»);

Valentin.sexy=false;

Valentin.age=rand()%5+1;

Создание массивов структур

ORC Valentin_Cloun[50];

for(i=0;i<50;i++)

{

Valentin_Cloun[i].sexy = (rand()%3)/2;

Valentin_Cloun[i].age=65+rand()%40;

}

Инициализация структур

ORC Valya [10]={{«RogkOFF, false, 4}, {“RogkOtrue,2},…..};

Структуры и функции

Структуры значительно облегчают процесс обмена данными между функциями. Без использования структур длинный список аргументов:

1) Делает программу нечитабельной

2) Увеличивает время на формирование параметров(создание копий в стеке)

3) Занимает место в стеке

Структуры могут быть переданы в функцию по значению и по адресу.