
- •1.1. _Классика. Общие сведения
- •1.1.3. Элементарные функции ввода-вывода
- •1.2. Функции
- •Void surface(int dl, int VI, int shi);
- •1.3.1. Задание значений аргумента функций по умолчанию
- •1.3.2. Перезагружаемые функции (function overloading)
- •1.3.4. Допускается использование функции с различным количеством аргументов.
- •1.3.6. Дружественные функции (friend)
- •1.3.8. Шаблоны.
- •1.3.9. Виртуальные (virtual) функции
- •1.3.10. Абстрактные классы
- •1.4. Указатели (ссылки). Массивы.
- •Int fprintf ([указатель-На-Входной-Поток], Управляющая-строка, [,Имя-переменной-1, [Имя-переменной-2…]]);
- •Int cprintf (УправляющаяСтрока[,Имя-переменной-1, [Имя-переменной-2…]]);
- •1.6.1 Директива Include
- •1.6.2 Директивы #define и #undef
- •1.6.3 Условные Директивы
- •1.8..Проект (создание проекта классическими средствами языка с)
- •1 .8.1. Классы памяти
- •1.8.3. Проект
- •Раздел 2. Классы
- •31.10.11 Кр Связан с созданием классов и про ооп
- •Лекция 8 от 17.10.2011
- •7.2.2. Динамически присоединенные библиотеки
1.3.1. Задание значений аргумента функций по умолчанию
Впервые в языке С появилась возможность задавать (присваивать) значения формальных параметров по умолчанию. Это позволило достичь 3-х целей:
Сократить текст программ
Избежать ошибок
Создать возможность реализации принципа инкапсуляции при переходе к ООП
Инкапсуляция – скрытие информации. У объекта могут свойства, недоступные прикладному программисту.
Int Stepen (int per, int st=2)
{ if (st==2)
Return (per *per);
Else
Return (Stepen (per, st-2) *per);
}
Присваивать значения функции по умолчанию допускается только строго справа налево. Функции можно присвоить значение по умолчанию только в том случае, если всем аргументам справа от него уже присвоены значения по умолчанию.
Пример 1.1 (для 3-ей лабы, его должны прислать)
Void status (int x=2, int y=3, char *message=”F10-меню|Alt-X-выход|ENTER-редактирование|F4-реквизиты”) //Сообщение в основной области экрана, т.к. цвет не меняется
{textattr(WIN_BACK);
Lay(x, y, message);
}
Void status(int x, int y, char *message=”Press any key…”, int color=WIN_BACK)
//Сообщение в любой области экрана с указанием цвета
{textattr(WIN_BACK);
Lay(x, y, message);
}
Void status (…..
1.3.2. Перезагружаемые функции (function overloading)
В языке С допускается присваивать одинаковые имена различным по содержанию функциям.
Цель: использование перезагружаемых функций позволяет
сократить количество использованных имен функций, объединив их в единое целое по назначению. Таким примером является функция printf. (На прошлой лекции мы говорили про элементарные функции ввода-вывода)
для облегчения создания классов ооп и экземпляров классов, например, при организации обработки динамических массивов с заранее неизвестной размерностью (одномерные, двумерные и т.д. массивы)
Перезагружаемые функции лежат в основе полиморфизма, когда одно и то же имя задается для различных объектов.
Double aver_arr(counct double a[], int size); // функция рассчитывает среднее арифметическое
Int aver_arr(counct double a[], int size); Прототипы функций
…
Double aver_arr(counct double a[], int size);
{ double sum=0.0;
For (int I=0. I<size;I++)
Sum+=a[I];
Return (sum/size);
}
Полиморфизм – это свойство, которое позволяет одно и то же имя использовать для решения нескольких технически разных задач
При перезагрузке функций компилятором выбор конкретной функции производится по идентификатору функции (по имени функции) и типу ее формальных параметров на основе алгоритма соответствия сигнатуры: компилятор строит уникальные имена, состоящие из имени функции и типа данные ее формальных параметров. С этими же идентификаторами в дальнейшем работает компоновщик и библиотекарь среды разработки.
Т.о. в одном проекте могут быть одинаковые имена функций, но обязательно с различными типами данных. (!)
Исключение: одинаковые имена и типы данных, если одна функция «инстерн», а другая «статик» (т.е. внешняя и внутренние функции)
Int aver_arr(counct int a[], int size)
{ int sum=0;
For (int I=0; I<size;I++)
Sum+=a[I];
Return (sum/size);
}
…
Void main(void)
{ int a[5]={1,2,3,4,5};
Double b[6]={1.02, 2.0, 3.45, 4.01, 5.89, 6.0};
Cout<<aver_arr(a,5);
Cout<<aver_arr(b,6);
}
(Второй бал, если создать свой собственный класс средствами языка С. Не средствами Билдера. Самим придумать, что он должен делать)
Примеры ошибок
Не допускается использование перезагружаемых функций, если компилятор будет поставлен в условие неопределенности, т.е.
А) int example (int per);
Int example (int & per);
В обоих случаях тип данных по смыслу – различные варианты. Вызов функции отличается только операцией определения адреса. Адрес зависит от Ос, мы пересылаем тип данных int.
Б) static void example (int per)
Void example (int per)
Отличаются областью видимости и временем жизни.
В) int example (void)
Void example (void)
Отличаются типом возвращаемого результата
1.3.3. В языке С допускается рекурсивный вызов функций, т.е. одна и та же функция может вызывать сама себя.
Int Stepen (int per, int st=2)
{ if (st==2)
Return(per *per);
Else
Return(Stepen(per,st-2)*per);
}
Возможные ошибки:
Unsigned long factorial (insigned long per)
{ return per>2&per*Factorial(per-1);per;
}