|
Программирование >> Процедурные приложения
o Оператор расширения области видимости Краеугольным камнем, лежащим в основе языков С и C++, являются функции. В данной главе рассматриваются основные концепции создания и использования функций. Вы познакомитесь с понятием прототипа функции, которое было введено в стандарте ANSIC На многочисленных примерах будет показано, как работать с аргументами различных типов и как создавать функции, возвращающие значения различных типов. Вы также узнаете, как с помощью стандартных параметров argc и argv получать аргументы командной строки в функции main(). Кроме того, будет рассказано об уникальных возможностях функций в языке. C++. Основную часть программного кода в C/C++ составляют функции. Они позволяют разбивать программу на отдельные блоки или модули. Таким образом, модульное программирование обязано своим появлением именно функциям. Под модульным программированием подразумевается создание программ из отдельных, самостоятельно отлаживаемых частей, совокупность которых образует единое приложение. Например, один модуль может выполнять функцию ввода данных, другой - реализовывать вывод данных на печать, а третий - отвечать за сохранение данных на диске. По сути, программирование на языках С и C++ как раз и заключается в написании функций. Любая программа на этих языках содержит, по крайней мере, одну функцию - main(). От того, насколько успешно будут проработаны функции, зависит эффективность и надежность работы программы. В данной главе рассматривается много примеров программ, которые помогут вам лучше уяснить принципы создания функций. Многие из этих программ, помимо пользовательских, используют также встроенные библиотечные функции C/C++, которые значительно расширяют возможности программирования на этих языках. Прототипы функций После принятия стандарта ANSI С принципы программирования функций в языке С претерпели изменения. В основу было положено использование прототипов функций, которые широко применяются в C++. С этого момента в язык С была внесена некоторая сумятица, обусловленная одновременным существованием старого и нового стиля описания функций. Компиляторы поддерживают и тот, и другой, но, естественно, желательно придерживаться нового стиля. Синтаксис объявления функции В соответствии со стандартом ANSI С любая функция должна иметь прототип, т.е. заранее объявленный заголовок функции с указанием ее имени, типов аргументов и типа возвращаемого значения. Прототип может размещаться как в теле программы (до первого обращения к функции), так и в отдельном файле заголовков. (В этой книге мы для наглядности размещаем прототипы в теле программы.) Прототип функции снабжает компилятор информацией о том, аргументы какого типа ожидает функция и значение какого типа она возвращает. Это позволяет компилятору выполнять строгую проверку типов. В ранней версии языка С в объявлении функции указывались только имена ее аргументов. В этой книге мы придерживаемся нового стиля, синтаксис которого таков: тип результата имя функции(тип аргумента необязательное имя аргумента[, ...]); Функция может возвращать значения типа void, int,float и т.д. Имя функции может быть произвольным, но желательно, чтобы оно указывало на ее назначение. Если для выполнения функции нужно предоставить ей некоторую информацию в виде аргумента, то в круглых скобках должен быть указан тип аргумента и, при необходимости, его имя. Тип аргумента может быть любым. Если аргументов несколько, их описания (тип плюс имя) разделяются запятыми. Не будет ошибкой указание в прототипе только типа аргумента, без имени. Такая форма записи прототипов применяется в библиотечных функциях. Описание функции представляет собой часть программного кода, которая, как правило, следует за телом функции main(). Синтаксис описания следующий: тип результата имя функции(тип аргумента имя аргумента[, ...]) { тело функции ) Обратите внимание на то, что строка заголовка функции идентична строке описания ее прототипа, за одним маленьким исключением: она не завершается точкой с запятой. Ниже показана программа, в которой имеется пример описания функции: * prototyp.c * Эта программа на языке С содержит описание функции. * Функция находит сумму двух целочисленных аргументов и возвращает * результат в виде целого числа. #include <stdio.h> int iadder(int ix, int iy) ; /* прототип функции */ int main () { int ia = 23; int ib = 13; int ic; ic = iadder(ia, ib) ; printf( Сумма равна %d\n ,ic) ; return(0); int ladder(int ix, int iy) /* описание функции */ int iz; iz = ix + iy; return(iz); /* возвращаемое значение */ Функция в нашем примере называется iadder(). Она принимает два целочисленных аргумента и возвращает целочисленное значение. В соответствии со стандартом ANSI С рекомендуется, чтобы прототипы всех функций размешались в отдельных файлах заголовков. Вот почему библиотеки .функций распространяются вместе с файлами заголовков. Но в простых программах вроде той, которую мы только что рассмотрели, допускается описание прототипа функции прямо в тексте программы. Описание функции iadder() в программе на языке C++ будет выглядеть идентично: prototyp.cpp Эта программа на языке C++ содержит описание функции. Функция находит сумму двух целочисленных аргументов и возвращает результат в виде целого числа. #include <iostream.h> int ladder(int ix, int iy); прототипфункции int main() { int ia = 23; int ib = 13; int ic; ic = iadder(ia,ib) ; cout<< Сумма равна << ic \n ; return (0); } int ladder(int ix, int iy) описаниефункцииint iz; iz = ix + iy; return(iz); возвращаемое значение Способы передачи аргументов В предыдущих двух примерах в функцию передавались значения аргументов. Когда происходит передача переменной-аргумента по значению, в функции создается локальная переменная с именем аргумента, в которую записывается его значение. Внутри функции может измениться значение этой локальной переменной, но не самого аргумента. В случае передачи переменной-аргумента по ссылке функция получает адрес аргумента, а не его значение. Создаваемая при этом локальная переменная является указателем. Такой подход, кроме всего прочего, позволяет немного сэкономить память. И, естественно, во время выполнения функции значение переменной-аргумента может измениться. Особенность этого метода состоит в том, что функция может возвращать сразу несколько значений тому процессу, из которого она была вызвана: как через аргументы-ссылки, так и непосредственно через инструкцию return. В следующем примере рассмотренная выше функция ladder() принимает адреса аргументов, передаваемых по ссылкам. Такой способ может быть реализован как в С, так и в C++. * ref.c * Эта программа на языке С демонстрирует использование указателей * в качестве аргументов функции. #include <stdio.h> int ladder(int *pix, int *piy); int main () int ia = 23; int ib = 13; int ic; ic = iadder(&ia,Sib) ; printf( Сумма равна %d\n , ic); return(0); } int ladder (int*pix, int *piy) int iz; iz = *pix + *piy; return(iz); } В языке C++ при передаче аргументов можно вместо указателей использовать непосредственно ссылки. Это гораздо удобнее и упрощает текст программы, так как ссылки тоже указывают на аргумент, но не требуют использования оператора раскрытия указателя. Вот пример той же программы на языке C++: ref.cpp Эта программа на языке C++ демонстрирует использование ссылок в качестве аргументов функции. #include <iostream.h> int iadder (int Srix, int Sriy) ; int main () int ia = 23; int ib = 13; int ic; ic = iadder (ia,ib) ; cout<< Сумма равна << ic<< \n ; return (0); int ladder(int Srix, int sriy) I int iz; iz = rix + riy; return(iz); }
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |