
- •Часть 2. Дискретная математика. Структуры данных. Алгоритмы. Информатика.
- •4.1. Ограниченно-детерминированные функции
- •Ограниченно-детерминированные функции
- •Открытое хеширование
- •Закрытое хеширование
- •Метод остатков от деления
- •Метод функции середины квадрата
- •Метод свертки
- •Семафорные примитивы Дейкстры
- •4.6 Семафорные примитивы Дейкстры.
- •Концепция
- •Задача “Поставщик - Потребитель”.
- •Мониторы Хоара
- •[Править]Тип 0 — неограниченные
- •[Править]Тип 1 — контекстно-зависимые
- •[Править]Тип 2 — контекстно-свободные
- •[Править]Тип 3 — регулярные
- •Синтаксический анализ
- •Условия использования метода рекурсивного спуска
- •Устранение левой рекурсии
- •[Править]Устранение непосредственной левой рекурсии
- •[Править]Пример
- •[Править]Алгоритм устранения произвольной левой рекурсии
- •[Править]Асимптотика
- •[Править]Пример
- •[Править]Варианты реализации [править]Предсказывающий парсер
- •[Править]Парсер с возвратом
- •Виртуальные и динамические методы
- •Динамические методы
- •Символьные массивы (строки)
- •Создание функции
- •Формальные и фактические параметры
- •Очередность вызова и рекурсия
- •Способы передачи параметров в функцию
- •Перегрузка функций
- •Абстракция данных
- •Ключевые черты ооп
- •Наследование
- •Private-наследование
- •Protected-наследование
- •Public-наследование
- •Статические члены класса
- •Указатель this
- •Перегрузка операторов
- •Примеры некоторых классов Класс комплексных чисел
- •Аналитическая модель поверхности
- •Векторная полигональная модель
- •Воксельная модель
- •Равномерная сетка
Перегрузка функций
Уникальность функции определяется не только её именем, но и набором её параметров и типом возвращаемого значения. C++ позволяет создавать функцию с именем ранее существовавшей при условии, что у новой функции будет иной набор параметров.
Пример:
void printarr(int* const a, const int& n) {
for(int i = 0; i<n; i++) cout << a[i] << ' ';
}
void printarr(char* const a) {
cout << a;
}
Тип возвращаемого значения, при этом, может как отличаться, так и совпадать (но нельзя создавать функции с одинаковыми именами и наборами значений, различающиеся только типом возвращаемого значения).
Перегрузка функций удобна для выполнения аналогичных действий для значений разных типов:
double frac(int a, int b) {
return (double)a/b;
}
double frac(double a, double b) {
return a/b;
}
...
cout << frac(7,3) << endl; // работает первая функция
cout << frac(7.5,2.5) << endl; // работает вторая функция
Какую из функций вызвать, программа определяет на основе типов переданных параметров.
А вот такой вызов вызовет ошибку компиляции:
cout << frac(3.14,2) << endl;
Хотя и существует автоприведение, компилятор не может понять, какой из вариантов функции мы собираемся использовать.
Если мы дополнительно определим функцию с параметром по умолчанию, как перегруженную, то также требуется следить за однозначностью при вызове.
Пример:
double frac(int a, int b, double c = 3.14) {
return (double)(a/b)*c;
}
Данная функция хоть и является очередной перегрузкой функции frac не может быть использована, потому что в случае вызова frac(4,3) — не понятно, какой вариант использовать: первый или третий.
Следующая программа на языке C++ также содержит пример передачи массива в функцию. // // arrayarg.cpp // Эта программа на языке C++ демонстрирует передачу массива в качестве // аргумента функции. // #include ‹iostream.h› #define iSIZE 5 void vadd_l (int iarray[]); main() { int iarray[iSIZE] = {0,1, 2, 3, 4 } ; int i; cout << "Массив iarray перед вызовом функции vadd_l:\n\n"; for(i = 0; i < iSIZE; i++) cout << " " << iarray[i]; vadd_l(iarray); cout << "\n\nМассив iarray после вызова функции vadd_l:\n\n"; for(i =0; i < iSIZE; i++) cout << " " << iarray[i]; return(0); } void vadd_l(int iarray[]) { int i; for(i =0;i < iSIZE; i++) iarray [i]++; } В процессе выполнения программы на экран будет выведена следующая информация: Массив iarray перед вызовом функции vadd_l: 0 1 2 3 4 Массив iarray после вызова функции vadd_l: 1 2 3 4 5 Результаты работы программы дают четкий ответ на вопрос о том, каким способом массив передается в функцию: по значению или по ссылке. Функция vadd_l() добавляет единицу к каждому элементу массива. Так как это действие отражается на массиве iarray в функции main(), можно сделать вывод, что аргумент передается по ссылке.
41,42
Поля (или свойства, в рамках C++ это можно считать синонимом) описывают то, какие данные смогут хранить экземпляры класса (т.е. объекты). Конкретные значения сохраняются уже внутри объектов. Поля объявляются в теле класса.
К полям внутри класса можно обращаться непосредственно по именам полей.
Методы класса — это функции, которые смогут применяться к экземплярам класса. Грубо говоря, метод — это функция объявленная внутри класса и предназначенная для работы с его объектами.
Методы объявляются в теле класса. Описываться могут там же, но могут и за пределами класса (внутри класса в таком случае достаточно представить прототип метода, а за пределами класса определять метод поставив перед его именем — имя класса и оператор ::).
Методы и поля входящие в состав класса называются членами класса. При этом методы часто называют функциями-членами класса.
Пример:
class Complex {
double img;
double real;
};
В примере описан класс Complex с двумя полями img и real.