Выше упоминалось, что void-функция может иметь несколько инструкций return. То же самое относится и к функциям, которые возвращают значения. Например, представленная в следующей программе функция find_substr() использует две инструкции return, которые позволяют упростить алгоритм ее работы. Эта функция выполняет поиск заданной подстроки в заданной строке. Она возвращает индекс первого обнаруженного вхождения заданной подстроки или значение -1, если заданная подстрока не была найдена. Например, если в строке "Я люблю C++ " необходимо отыскать подстроку "люблю", то функция find_substr() возвратит число 2 (которое представляет собой индекс символа "л" в строке "Я люблю C++ ").

#include

using namespace std;

int find_substr(char *sub, char *str);

int main()

{

 int index;

 index = find_substr("три", "один два три четыре");

 cout << "Индекс равен " << index; // Индекс равен 9.

 return 0;

}

// Функция возвращает индекс искомой подстроки или -1, если она не была найдена.

int find_substr(char *sub, char *str)

{

 int t;

 char *p, *p2;

 for(t=0; str[t]; t++) {

  p = &str[t]; // установка указателей

  p2 = sub;

  while(*p2 && *p2==*p) { // проверка совпадения

   p++; p2++;

  }

  /* Если достигнут конец р2-строки (т.е. подстроки), то подстрока была найдена. */

  if(!*p2) return t; // Возвращаем индекс подстроки.

 }

 return -1; // Подстрока не была обнаружена.

}

Результаты выполнения этой программы таковы.

Индекс равен 9

Поскольку искомая подстрока существует в заданной строке, выполняется первая инструкция return. В качестве упражнения измените программу так, чтобы ею выполнялся поиск подстроки, которая не является частью заданной строки. В этом случае функция find_substr() должна возвратить значение -1 (благодаря второй инструкции return).

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

Функции, которые не возвращают значений (void-функции)

Как вы заметили, функции, которые не возвращают значений, объявляются с указанием типа void. Это ключевое слово не допускает их использования в выражениях и защищает от неверного применения. В следующем примере функция print_vertical() выводит аргумент командной строки в вертикальном направлении (вниз) по левому краю экрана. Поскольку эта функция не возвращает никакого значения, в ее объявлении использовано ключевое слово void.

#include

using namespace std;

void print_vertical(char *str);

int main(int argc, char *argv[])

{

 if(argc==2) print_vertical(argv[1]);

 return 0;

}

void print_vertical(char *str)

{

 while(*str)

 cout << *str++ << '\n';

}

Поскольку print_vertical() объявлена как void-функция, ее нельзя использовать в выражении. Например, следующая инструкция неверна и поэтому не скомпилируется.

х = print_vertical("Привет!"); // ошибка

Важно!В первых версиях языка С не был предусмотрен тип void. Таким образом, в старых С-программах функции, не возвращающие значений, по умолчанию имели тип int. Если вам придется встретиться с такими функциями при переводе старых С-программ "на рельсы" C++, просто объявите их с использованием ключевого слова void, сделав их void-функциями.

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

Все книги серии Изучайте C++ с профессионалами

Похожие книги