Функции, которые возвращают указатели
Функции могут возвращать указатели. Указатели возвращаются подобно значениям любых других типов данных и не создают при этом особых проблем. Но, поскольку указатель представляет собой одно из самых сложных (или небезопасных) средств языка C++, имеет смысл посвятить ему отдельный раздел.
Чтобы вернуть указатель, функция должна объявить его тип в качестве типа возвращаемого значения. Вот как, например, объявляется тип возвращаемого значения для функции f() , которая должна возвращать указатель на целое число.
Если функция возвращает указатель, то значение, используемое в ее инструкции return , также должно быть указателем. (Как и для всех функций, return ‑значение должно быть совместимым с типом возвращаемого значения.)
В следующей программе демонстрируется использование указателя в качестве типа возвращаемого значения. Это – новая версия приведенной выше функции find_substr() , только теперь она возвращает не индекс найденной подстроки, а указатель на нее. Если заданная подстрока не найдена, возвращается нулевой указатель.
При выполнении этой версии программы получен следующий результат.
В данном случае, когда подстрока "три" была найдена в строке "один два три четыре" , функция find_substr() возвратила указатель на начало искомой подстроки "три" , который в функции main() был присвоен переменной substr . Таким образом, при выводе значения substr на экране отобразился остаток строки, т.е. "три четыре" .
|
|
Многие поддерживаемые C++ библиотечные функции, предназначенные для обработки строк, возвращают указатели на символы. Например, функция strcpy() возвращает указатель на первый аргумент.
Прототипы функций
Прототип объявляет функцию до ее первого использования.
До сих пор в приводимых здесь примерах программ прототипы функций использовались без каких‑либо разъяснений. Теперь настало время поговорить о них подробно. В C++ все функции должны быть объявлены до их использования. Обычно это реализуется с помощью прототипа функции. Прототипы содержат три вида информации о функции:
■ тип возвращаемого ею значения;
■ тип ее параметров;
■ количество параметров.
Прототипы позволяют компилятору выполнить следующие три важные операции.
■ Они сообщают компилятору, код какого типа необходимо генерировать при вызове функции. Различия в типах параметров и значении, возвращаемом функцией, обеспечивают различную обработку компилятором.
■ Они позволяют C++ обнаружить недопустимые преобразования типов аргументов, используемых при вызове функции, в тип, указанный в объявлении ее параметров, и сообщить о них.
|
|
■ Они позволяют компилятору выявить различия между количеством аргументов, используемых при вызове функции, и количеством параметров, заданных в определении функции.
Общая форма прототипа функции аналогична ее определению за исключением того, что в прототипе не представлено тело функции.
Использование имен параметров в прототипе необязательно, но позволяет компилятору идентифицировать любое несовпадение типов при возникновении ошибки, поэтому лучше имена параметров все же включать в прототип функции.
Чтобы лучше понять полезность прототипов функций, рассмотрим следующую программу. Если вы попытаетесь ее скомпилировать, то получите от компилятора сообщение об ошибке, поскольку в этой программе делается попытка вызвать функцию sqr_it() с целочисленным аргументом, а не с указателем на целочисленное значение (согласно прототипу функции). Ошибка состоит в недопустимости преобразования целочисленного значения в указатель.
Важно! Несмотря на то что язык С допускает прототипы, их использование не является обязательным. Дело в том, что в первых версиях С они не применялись. Поэтому при переводе старого С‑кода в С++‑код перед компиляцией программы необходимо обеспечить наличие прототипов абсолютно для всех функций.
|
|
Подробнее о заголовках
В начале этой книги вы узнали о существовании стандартных заголовков C++, которые содержат информацию, необходимую для ваших программ. Несмотря на то что все вышесказанное – истинная правда, это еще не вся правда. Заголовки C++ содержат прототипы стандартных библиотечных функций, а также различные значения и определения, используемые этими функциями. Подобно функциям, создаваемым программистами, стандартные библиотечные функции также должны "заявить о себе" в форме прототипов до их использования. Поэтому любая программа, в которой используется библиотечная функция, должна включать заголовок, содержащий прототип этой функции.
Чтобы узнать, какой заголовок необходим для той или иной библиотечной функции, следует обратиться к справочному руководству, прилагаемому к вашему компилятору. Помимо описания каждой функции, там должно быть указано имя заголовка, который необходимо включить в программу для использования выбранной функции.
Дата добавления: 2018-09-22; просмотров: 449; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!