Рекурсивные функции.
Возможный конфликт при использовании параметров по умолчанию.
Ключевое слово const.
void func (const int *pn); // позволяет объявлять функции с ключевым словом const
Такое объявление параметра обеспечивает неизменяемость объекта, на который указывает pn, то есть это позволяет компилятору блокировать нежелательные побочные эффекты вызова функции.
void func1 (const char *pc)
{
//*pc=’A’;
}
Замечание:
1) при объявлении константных параметров ключевое слово const должно фигурировать как в объявлении функции, так и в ее определении;
2) нет необходимости объявлять с идентефикатором const параметры, которые представляют значение объекта, так как функция получает только копии исходных переменных.
void func(const int n);
“Перегрузка” имён функции.
Перегрузка – одна из особенностей C++, которая позволяет использовать одно и то же имя для разных функций.
Этот механизм возможен ввиду того, что функции с одним и тем же именем, но с разным количеством и разными типами параметров компилятор декорирует по-разному.
|
|
Ограничение в использовании перегрузки:
1) не могут перегружаться функции, имеющие совпадающий тип и число аргументов, но разные типы возвращающих значений;
2) не могут перегружаться функции, имеющие неявно совпадающие типы аргументов.
int MaxInt(int x; int y)
{
return (x>y);
}
double MaxDouble (double x, double y)
{
return (x>y);
}
//примеры без перегрузки
main()
{
int i=MaxInt (12,8);
double d= MaxDouble(1.1;2.2);
}
C перегрузкой:
main()
{
int i=Max(12,8);
double d= Max(1.1, 2.2);
double dd=Max(1.1, 2); //ERROR!!
}
void f(int x, int y=5);
void f(int x, int y = 0);
void f (int);
int main () {
f (2, 5); // ошибка
f (5); // ошибка, компилятор не знает, какую функцию вызывать.
}
Вызывают сами себя.
Происходит выполнение одного и того же кода с разными наборами данных.
Каждое выполнение тела функции имеет свою область стека для параметров и локальных переменных.
Достоинства:
Ø компактность.
Недостатки:
Ø большие затраты времени на вызов функции;
Ø большие затраты памяти (стека) для организации каждого вложенного цикла.
Специфика рекурсивных функций:
1) программист должен обеспечивать выход из рекурсии;
2) по мере возможности следует избегать использования с рекурсивной функцией локальных переменных.
Факториал без рекурсии:
int n=5;
int res=1;
for(int i=n; i>1; i--)
res *=i;
int F(int n)
{
if (n<=1)
return 1;
else
{
int x=F(n-1);
return n*x;
}
}
В большом количестве случаев удобно обращаться к совокупности переменных Структура языка Си – средство для укрупнения данных.
Объявление структуры – описание компилятором шаблона, по которому он будет создавать объект данного типа.
struct имя
{
список полей структуры
}
struct student
{
char name[30]
unsigned int cource,
bool sex;
int age;
…
}