
Информатика.-1
.pdf240
1.Точное сопоставление: сопоставление произошло без всяких преобразований типа или только с неизбежными преобразованиями (например, имени массива в указатель, имени функции в указатель на функцию и типа T в const T).
2.Сопоставление с использованием стандартных целочис-
ленных преобразований, определенных в (т.е. char в int, short в int и их беззнаковых двойников в int), а также преобразований float в double.
3.Сопоставление с использованием стандартных преобразований, определенных в С++ (например, int в double, unsigned в int).
4.Сопоставление с использованием пользовательских преобразований.
5.Сопоставление с использованием эллипсиса (многоточия
...) в описании функции.
Если найдены два сопоставления по самому приоритетному правилу, то вызов считается неоднозначным, процесс компиляции останавливается и выдается соответствующее сообщение об ошибке. Эти правила сопоставления параметров работают с учетом правил преобразований арифметических типов для С и С++.
Пусть имеются такие описания функции print:
void print(int);
void print(const char*); void print(double); void print(long);
void print(char);
Тогда результаты следующих вызовов print() будут такими:
void h(char c, int i, short s, float f)
{
print(c); // точное сопоставление: вызывается print(char)
print(i); // точное сопоставление: вызывается print(int)
print(s); // стандартное целочисленное преобразование: // вызывается print(int)
print(f); // стандартное преобразование: // вызывается print(double)
241
print('a'); // точное сопоставление: вызывается print(char) print(49); // точное сопоставление: вызывается print(int) print(0); // точное сопоставление: вызывается print(int)
print("a"); // точное сопоставление:
// вызывается print(const char*)
}
Обращение print(0) приводит к вызову print(int), ведь 0 имеет тип int. Обращение print('a') приводит к вызову print(char), т.к. 'a' — типа char .
Отметим, что на разрешение неопределенности при перегрузке не влияет порядок описаний рассматриваемых функций, а типы возвращаемых функциями значений вообще не учитываются.
Исходя из этих правил, можно гарантировать, что если эффективность или точность вычислений значительно различаются для рассматриваемых типов, то вызывается функция, реализующая самый простой алгоритм. Например:
int pow(int, int);
double pow(double, double); |
// из <math.h> |
|
complex |
pow(double, complex); |
// из <complex.h> |
complex |
pow(complex, int); |
|
complex |
pow(complex, double); |
|
complex |
pow(complex, complex); |
|
void k(complex z) |
|
|
{ |
|
|
int i = |
pow(2,2); // вызывается pow(int,int) |
double d = |
pow(2.0,2); |
// вызывается pow(double,double) |
|
complex z2 |
= pow(2,z); |
// вызывается pow(double,complex) |
|
complex z3 |
= |
pow(z,2); |
// вызывается pow(complex,int) |
complex z4 |
= |
pow(z,z); // вызывается pow(complex,complex) |
|
} |
|
|
|
242
Таким образом, возможно определение нескольких функций с одинаковыми именами, но разными типами параметров. Эти функции называются перегруженными. При вызове перегруженной функции компилятор выбирает соответствующую функцию, анализируя количество и тип аргументов в вызове.
Перегруженные функции могут иметь разные или одинаковые типы возвращаемых значений и обязательно должны иметь разные списки параметров. Две функции, отличающиеся только типами возвращаемых значений, вызовут ошибку компиляции.
9.5 Резюме по теме функции
Функция активизируется посредством вызова функции. В вызове указывается имя функции и передается информация (в виде аргументов), которая нужна вызываемой функции для выполнения ее задачи. Выражение вызова функции состоит из имени функции, за которым в круглых скобках, следуют аргументы функции, список ее фактических параметров.
Каждый фактический параметр функции может быть константой, переменной или выражением.
Локальная переменная известна только в описании данной функции. Функции не знают детали реализации другой функции (включая локальные переменные). Цель скрытия информации в функциях заключается в том, чтобы дать доступ только к той информации, которая нужна для выполнения их задач. Это средство реализации принципа наименьших привилегий, одного из наиболее важных принципов разработки хорошего программного обеспечения.
Общий формат определения функции:
Тип-возвращаемого-значения имя-функции (список-параметров) { Тело-функции }
Тип-возвращаемого-значения устанавливает тип значения, возвращаемого в вызывающую функцию. Если функция не возвращает значение, mun-возвращаемого-значения объявляется как void.
Имя-функции — любой правильно написанный идентификатор. Список-параметров — написанный через запятые список, содержащий объявления переменных, которые будут переданы
243
функции. Если функция не принимает никаких значений, списокпараметров оставляется пустым, либо объявляется как void.
Тело-функции — набор объявлений и операторов, которые составляют текст программы, реализующей функцию.
Аргументы, передаваемые функции, должны быть согласованы по количеству, типу и порядку следования с параметрами в определении функции.
Когда программа доходит до вызова функции, управление передается из точки активации к вызываемой функции, функция выполняется и управление возвращается оператору вызова.
Вызываемая функция может вернуть управление оператору вызова одним из трех способов. Если функция не возвращает никакого значения (объявлен тип возврата void), управление возвращается при достижении закрывающей операторной скобки, охватывающей тело функции или при выполнении оператора
return;
Если функция возвращает значение, то возврат производится оператором
return выражение;
Где тип и значение выражения и определяют то, что возвращается функцией в вызывающую программу.
Прототип (или объявление) функции объявляет тип возвращаемого значения функции, количество, типы и порядок следования параметров, передаваемых в функцию.
Прототипы функций дают возможность компилятору проверить, правильно ли вызывается функция.
Компилятор игнорирует имена переменных, упомянутые в прототипе функции.
Если аргумент передается в функцию по значению, создается копия значения переменной и именно она передается вызываемой функции. Изменения копии в вызываемой функции не влияют на значение исходной переменной.
Локальные переменные, объявленные в начале функции, имеют областью действия блок подобно параметрам функции, которые считаются локальными переменными функции.
244
Единственными идентификаторами, имеющими областью действия прототип функции, являются те, которые использованы в списке параметров прототипа функции. Идентификаторы, использованные в прототипе функции, можно повторно использовать в других местах программы без опасений возникновения неопределенности.
Функция, не возвращающая значение, объявляется с типом void. Если предпринять попытку вернуть значение функции или использовать результат активизации функции в вызывающем выражении, компилятор сообщит об ошибке.
Пустой список параметров указывается пустыми круглыми скобками или ключевым словом void в круглых скобках.
Встраиваемые функции исключают накладные расходы, связанные с вызовом функции. Программист может использовать ключевое слово inline, чтобы рекомендовать компилятору сгенерировать машинные коды функции в нужных местах программы (если это возможно), чтобы минимизировать вызовы функции. Компилятор может проигнорировать inline.
C++ предусматривает возможность прямой формы вызова по ссылке с помощью ссылочных параметров. Чтобы указать, что параметр функции передается по ссылке, после типа параметра в прототипе функции пишется символ &. В вызове функции переменная указывается по имени, но она будет передана по ссылке. В вызываемой функции обозначение переменной ее локальным именем на самом деле отсылает к исходной переменной в вызывающей функции. Таким образом, исходная переменная может быть изменена с помощью вызываемой функции.
Спецификация const может создать именованную константу. Именованная константа должна получить в качестве начального значения постоянное выражение и после этого не может изменяться. Именованные константы часто называют постоянными переменными или переменными только для чтения. Именованные константы могут быть помещены всюду, где может быть помещено постоянное выражение. Другим распространенным применением спецификации const является создание ссылок на константы.
245
ЛИТЕРАТУРА
1.Симонович С.В. Информатика. Базовый курс. 2-е изд.: Учебник для вузов. — СПб.: Питер, 2006. — 640 с.
2.Конев Ф.Б. Информатика для инженеров: Учебное пособие. — М.: Высшая школа, 2004. — 272 с.
3.Острейковский В А. Информатика: Учебник для вузов. —
М.: Высшая школа, 2001. — 512 c.
4.Акулов О.А., Медведев Н.В. Информатика: базовый курс. 4-е изд. Учебник для вузов. — М.: Омега-Л, 2007, 560 с.
5.Н. В. Макарова [и др.] Информатика: Практикум по технологии работы на компьютере: Учебное пособие для вузов. — 3-е изд., перераб. — М.: Финансы и статистика, 2005. — 255 с.
6.Павловская Т.А. C/C++. Программирование на языке высокого уровня: Учебник для вузов. — СПб.: Питер, 2006. — 461 с.
7.Воройский Ф.С. Информатика. Новый систематизированный толковый словарь-справочник. — М.: ФИЗМАТЛИТ, 2003. — 760 с.
8.Пасько В. Энциклопедия ПК. Аппаратура. Программы. Интернет. — СПб.: Питер, 2004. — 800 с.
9.Волкотруб Л.П., Егоров И.М. Компьютер и здоровье. — Томск: Томск. гос. ун-т систем упр и радиоэлектроники, 2006. — 158 с.
10.Дьяконов В. Mathcad 2001: Учебный курс. — СПб.: Пи-
тер, 2001.
11.Кирьянов Д.В. Самоучитель Mathcad 13. — СПб.: БХВ-
Петербург, 2006. — 528 с.
12.Франка П. С++: Учебный курс: Пер. с англ. П. Бибикова. —
СПб.: Питер, 2005. — 521 с
13.Павловская Т.А., Щупак Ю.А. C++. Объектно-ориенти- рованное программирование: практикум: Учебное пособие для вузов. — СПб.: Питер, 2005. — 464 с
14.Боровский А.Н. Самоучитель C++ и Borland C++ Builder: самоучитель. — СПб.: Питер, 2005. — 255 с.