Функция, которая ничего не возвращает
Параметры функций со значениями по умолчанию
Рекурсивная функция
Fibonacci (n) = Fibonacci (n - 1) + Fibonacci (n - 2)
Функции с несколькими операторами return
Перегрузка функций
Передача в функцию массива значений
Функция, которая выводит на консоль целое число, может быть представлена следующим образом:
void Displaylnteger (int number);
Прототип функции, способной отобразить массив целых чисел, должен быть немного другим:
void Displaylntegers( int[] numbers, int length);
Первый параметр указывает, что передаваемые в функцию данные являются массивом, а второй параметр указывает его длину, чтобы, используя массив, вы не вышли за его границы
Передача аргументов по ссылке
Иногда нужны функции, способные работать с исходной переменной или изменять значение так, чтобы это изменение было доступно вне функции, скажем, в вызывающей функции. В таком случае следует объявить параметр как получающий аргумент по ссылке (by reference).
Используя оператор return , функция может возвратить только одно значение. Но если функция должна возвращать вызывающей функции несколько значений, то передача аргументов по ссылке является единственным способом, обеспечивающим такой возврат информации вызывающей функции.
Как процессор обрабатывает вызовы функций
Понятие стека
Встраиваемые функции
Автоматический вывод возвращаемого типа
Лямбда-функции
Лямбда-функции введены стандартом С++11 и очень помогают использовать алгоритмы STL для сортировки и обработки данных. Как правило, функция сортировки требует бинарного предиката, который представляет собой функцию, сравнивающую два аргумента и возвращающую true, если первый меньше второго, и false в противном случае (тем самым определяя порядок, в котором должны находиться отсортированные элементы). Такие предикаты обычно реализуются в виде операторов класса, что требует весьма кропотливого программирования.
Почему бы не встраивать каждую функцию? Ведь это увеличит скорость выполнения, не так ли?
Все зависит от обстоятельств. Результатом встраивания всех функций будет многократное повторение их содержимого во множестве мест вызова, что приведет к увеличению объема кода. Поэтому наиболее современные компиляторы сами судят о том, какие вызовы могут быть встроены, в зависимости от настроек производительности.
У меня есть две функции, обе по имени Area. Одна получает радиус, а другая высоту. Я хочу, чтобы одна возвращала тип float, а другая тип double. Это возможно?
Для перегрузки обе функции нуждаются в одинаковом имени и одинаковом типе возвращаемого значения. В данном случае компилятор сообщит об ошибке, поскольку две функции с разными типами возвращаемых значений не могут иметь одинаковое имя.
Что такое указатель?
Объявление указателя
Определение адреса переменной с использованием оператора получения адреса &
Если varName — переменная, то выражение &varName возвращает адрес места в памяти, где хранится ее значение.
Так, если вы объявили целочисленную переменную, используя хорошо знакомый вам синтаксис
int age = 30;
то выражение &аgе вернет адрес области памяти, в которую помещается указанное значение 30.
Оператор получения адреса & иногда называют также оператором ссылки (referencing operator).
Использование указателей для хранения адресов
Чтобы сохранить адрес этой переменной в указателе, следует объявить указатель на тот же Тип и инициализировать его, используя оператор получения адреса &:
Доступ к данным с использованием оператора разыменования *
Значение sizeof ( ) для указателя
Результат выполнения оператора sizeof ( ) для указателя зависит от компилятора и операционной системы, для которой программа была скомпилирована, и не зависит от характера данных, на которые он указывает.
Динамическое распределение памяти
Когда вы пишете программу, содержащую объявление массива, такое как
int Numbers[100]; // Статический массив для 100 целых чисел
возникают две проблемы.
Причиной этих проблем является статическое, фиксированное выделение памяти для массива компилятором.
Чтобы программа могла оптимально использовать память, в зависимости от конкретных потребностей пользователя, необходимо использовать динамическое распределение памяти. Оно позволяет при необходимости выделять большее количество памяти и освобождать ее, когда необходимости в ней больше нет. Язык C++ предоставляет два оператора, new и delete , позволяющие управлять использованием памяти в вашем приложении. В эффективном динамическом распределении памяти критически важную роль играют указатели, хранящие адреса памяти.
Использование new и delete для выделения и освобождения памяти
Вы можете также определить количество элементов, для которых хотите выделить память (если нужно выделять память для массива элементов):
Тип* Указатель = new Тип[Количество]; // Запрос памяти для указан
// ного количества элементов
Таким образом, если необходимо разместить в памяти целые числа, используйте следующий код:
Каждая область памяти, выделенная оператором new, должна быть в конечном счете освобождена соответствующим оператором delete:
Это справедливо и при запросе памяти для нескольких элементов:
Использование ключевого слова const с указателями
Указатели — это особый вид переменных, которые содержат адреса областей памяти и позволяют модифицировать данные в памяти. Таким образом, когда дело доходит до указателей и констант, возможны следующие комбинации.
int hoursInDay = 24; const int\* const pHoursInDay = &HoursInDay; \*pHoursInDay = 25; // Ошибка компиляции: нельзя изменять значение, на которое указывает данный указатель int daysInMonth = 30; pHoursInDay = SdaysInMonth; // Ошибка компиляции: нельзя изменять значение данного указателя
Передача указателей в функции
Указатели — это эффективное средство передачи функции областей памяти, содержащих значения и способных содержать результат.
При использовании указателей с функциями важно гарантировать, что вызываемой функции разрешено изменять только те параметры, которые вы хотите позволить ей изменять, но не другие. Например, функции, вычисляющей площадь круга по заданному радиусу, передаваемому через указатель, нельзя позволить изменять этот радиус. В этом случае пригодятся константные указатели, позволяющие эффективно управлять тем, что функции разрешено изменять, а что — нет.