Читайте также:
|
|
Лекция 6 – Еще о функциях (и о структуре программы). Шаблоны функций.
Содержание. Указатели на функции. Примеры использования указателей на функции. Массивы указателей на функции. Инициализация параметров функции, функции с параметрами по умолчанию, пример. Перегрузка функций. Использование перегруженных функций. Еще раз о структуре программы. Шаблоны функций. Использование шаблонов функций. Понятие инстанцирования шаблона. Замечание о параметризации функций и структурных типов, АТД. Явное задание аргументов шаблона при вызове, специализация шаблона функции (по Т.Павловской).
Выше мы познакомились с основами определения функций и различными способами передачи данных в функции и с тем, как результат работы функции возвращается в вызывающую программу
Теперь мы коснемся аспектов корректного использования функций, в частности, обсудим такие темы:
Указатели на функции
Указатель хранит значение адреса, который у нас, чаще всего, пока был адресом переменной того же типа, что и указатель. Это позволяет гибко применять указатели, при необходимости, перенаправляя указатель на ту или иную переменную одного типа. Однако, механизм указателей применим и к функциям, т.е., указатель может содержать адрес некоторой функции. В этом случае, появляется возможность обращаться к функции через указатель, причем при этом вызывается та функция, адрес которой был предварительно присвоен указателю.
Понятно, что для корректного вызова функции необходима информация о списке ее параметров и возвращаемом типе. Поэтому, при объявлении указателя на функцию, мы должны в дополнение к имени указателя специфицировать типы параметров и тип возвращаемого значения, определяя тем самым множество тех функций, которые могут быть вызваны посредством данного указателя. Таким образом, указатель на функцию, рассматриваемый как тип, однозначно определяет сигнатуру (исключая имя) и тип функций, к которым он применим.
Замечание. Указатели на тип void.
àТип указателя void – это специальный тип указателя. void- указатели могут указывать на любой тип данных, от целочисленных до строки символов. Единственное ограничение, при этом, в том, что к такому указателю не может быть напрямую применена операция разыменования (*), поскольку размер единицы данных, на которые этот указатель ссылается, является неопределенным. По это причине, мы всегда должны использовать либо операции приведения типов, либо присваивание, для того, чтобы превратить наш void -указатель в указатель на конкретный тип данных.
Одним из применений таких указателей может быть передача в функцию, так называемых, обобщенных параметров, например:
// integer increaser#include <iostream.h> void increase (void* data, int type){ switch (type) { case sizeof(char): (*((char*)data))++; break; case sizeof(short): (*((short*)data))++; break; case sizeof(long): (*((long*)data))++; break; }}int main (){ char a = 5; short b = 9; long c = 12; increase (&a, sizeof(a)); increase (&b, sizeof(b)); increase (&c, sizeof(c)); cout << (int) a << ", " << b << ", " << c; return 0;}Напомним, что sizeof – встроенная в C++ операция, которая дает в результате размер в байтах, занимаемый в памяти операндом того или иного типа.
Дата добавления: 2015-11-16; просмотров: 63 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Как это работает | | | Объявление указателей на функции |