Функции, которые возвращают указатели



 

Функции могут возвращать указатели. Указатели возвращаются подобно значениям любых других типов данных и не создают при этом особых проблем. Но, поскольку указатель представляет собой одно из самых сложных (или небезопасных) средств языка C++, имеет смысл посвятить ему отдельный раздел.

Чтобы вернуть указатель, функция должна объявить его тип в качестве типа возвращаемого значения. Вот как, например, объявляется тип возвращаемого значения для функции f() , которая должна возвращать указатель на целое число.

 

 

Если функция возвращает указатель, то значение, используемое в ее инструкции return , также должно быть указателем. (Как и для всех функций, return ‑значение должно быть совместимым с типом возвращаемого значения.)

В следующей программе демонстрируется использование указателя в качестве типа возвращаемого значения. Это – новая версия приведенной выше функции find_substr() , только теперь она возвращает не индекс найденной подстроки, а указатель на нее. Если заданная подстрока не найдена, возвращается нулевой указатель.

 

 

При выполнении этой версии программы получен следующий результат.

 

 

В данном случае, когда подстрока "три" была найдена в строке "один два три четыре" , функция find_substr() возвратила указатель на начало искомой подстроки "три" , который в функции main() был присвоен переменной substr . Таким образом, при выводе значения substr на экране отобразился остаток строки, т.е. "три четыре" .

Многие поддерживаемые C++ библиотечные функции, предназначенные для обработки строк, возвращают указатели на символы. Например, функция strcpy() возвращает указатель на первый аргумент.

 

Прототипы функций

 

Прототип объявляет функцию до ее первого использования.

До сих пор в приводимых здесь примерах программ прототипы функций использовались без каких‑либо разъяснений. Теперь настало время поговорить о них подробно. В C++ все функции должны быть объявлены до их использования. Обычно это реализуется с помощью прототипа функции. Прототипы содержат три вида информации о функции:

■ тип возвращаемого ею значения;

■ тип ее параметров;

■ количество параметров.

Прототипы позволяют компилятору выполнить следующие три важные операции.

■ Они сообщают компилятору, код какого типа необходимо генерировать при вызове функции. Различия в типах параметров и значении, возвращаемом функцией, обеспечивают различную обработку компилятором.

■ Они позволяют C++ обнаружить недопустимые преобразования типов аргументов, используемых при вызове функции, в тип, указанный в объявлении ее параметров, и сообщить о них.

■ Они позволяют компилятору выявить различия между количеством аргументов, используемых при вызове функции, и количеством параметров, заданных в определении функции.

Общая форма прототипа функции аналогична ее определению за исключением того, что в прототипе не представлено тело функции.

 

 

Использование имен параметров в прототипе необязательно, но позволяет компилятору идентифицировать любое несовпадение типов при возникновении ошибки, поэтому лучше имена параметров все же включать в прототип функции.

Чтобы лучше понять полезность прототипов функций, рассмотрим следующую программу. Если вы попытаетесь ее скомпилировать, то получите от компилятора сообщение об ошибке, поскольку в этой программе делается попытка вызвать функцию sqr_it() с целочисленным аргументом, а не с указателем на целочисленное значение (согласно прототипу функции). Ошибка состоит в недопустимости преобразования целочисленного значения в указатель.

 

 

Важно! Несмотря на то что язык С допускает прототипы, их использование не является обязательным. Дело в том, что в первых версиях С они не применялись. Поэтому при переводе старого С‑кода в С++‑код перед компиляцией программы необходимо обеспечить наличие прототипов абсолютно для всех функций.

 

Подробнее о заголовках

 

В начале этой книги вы узнали о существовании стандартных заголовков C++, которые содержат информацию, необходимую для ваших программ. Несмотря на то что все вышесказанное – истинная правда, это еще не вся правда. Заголовки C++ содержат прототипы стандартных библиотечных функций, а также различные значения и определения, используемые этими функциями. Подобно функциям, создаваемым программистами, стандартные библиотечные функции также должны "заявить о себе" в форме прототипов до их использования. Поэтому любая программа, в которой используется библиотечная функция, должна включать заголовок, содержащий прототип этой функции.

Чтобы узнать, какой заголовок необходим для той или иной библиотечной функции, следует обратиться к справочному руководству, прилагаемому к вашему компилятору. Помимо описания каждой функции, там должно быть указано имя заголовка, который необходимо включить в программу для использования выбранной функции.

 


Дата добавления: 2018-09-22; просмотров: 449; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!