Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vstup.docx
Скачиваний:
47
Добавлен:
28.09.2019
Размер:
6.42 Mб
Скачать

Функції з параметрами, що замовчуються, зі зміними параметрами

Спецификация формальных параметров может содержать так называемое умалчиваемое значение. При этом спецификация формальных параметров имеет вид:

тип имя_параметра=умалчиваемое_значение

При вызове такой функции умалчиваемый параметр может быть опущен.

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

Пример 3.1

#include <stdio.h>

int def(int a, int b=3, int c=4)

{return a*b+c;}

int main()

{int am =2, bm=5, cm=6,res1,res2,res3;

res1=def(am); // 2*3+4=10

res2=def(am, bm); // 2*5+4=14

res3=def (am, bm, cm); // 2*5+6=16

printf(“res1=%d res2=%d res3=%d\n”,res1,res2,res3);

return 0;}

В результате работы программы на экран выведется:

res1=10 res2=14 res3=16

Значение умалчиваемых параметров указывается в прототипе функции, а в определении не указывается.

8.5 Перевантаження функцій. Шаблони функцій. Покажчики на функції. Перевантажені функції, шаблони функцій.

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

Распознавание перегруженных функций при вызове выполняется только по сигнатурам (списку формальных параметров функции).

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

В данном примере компилятор различает функции по типу передаваемых в них параметров.

#include <stdio.h>

int FF(int x,int y) {return x*x+y*y;}

float FF(float x, float y) {return x*x+y*y;}

int main()

{int a1=3,a2=4,a3;

a3=FF(a1,a2);

float d1=5.5,d2=7.5,d3;

d3=FF(d1,d2);

printf("a3=%d d3=%.2f\n", a3,d3);

return 0;}

В результате работы программы на экран выведется:

a3=25 b3=160400 d3=86.50

В следующем примере компилятор различает функции по количеству передаваемых в них параметров.

#include <stdio.h>

double mul(double x) {return x*x*x;}

double mul(double x,double y) {return x*y*y;}

double mul(double x,double y,double z) {return x*y*z;}

int main()

{double M1=mul(0.2);

double M2=mul(0.2,0.4);

double M3=mul(0.2,0.3,0.4);

printf("M1=%.2lf M2=%.2lf M3=%.2lf\n", M1,M2,M3);

return 0;}

В результате работы программы на экран выведется:

M1=0.08 M2=0.0322 M3=0.024

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

int mul(double x,double y)

{if (x>y)return 1; else return 2;}

Для автоматизации создания перегруженных функций различного вида в С++ введены шаблоны функций. Определяется шаблон семейства функций следующим образом

template <class type1,class type 2, и т.п.>

где type1, type2 и т.д. – формальные параметры шаблона.

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

Пример

template <class Tip>

Tip abs(Tip x)

{return x>0?+x:-x;}

int main()

{int a=-7;

a=abs(a);

float f=-3.6;

f=abs(f);

printf("a=%d f=%f\n",a,f);

return 0;}

При компиляции программы с шаблоном функции, компилятор при обработке вызова функции доопределяет ее. Если в тексте программы встретился вызов функции a=abs(a), где a – переменная типа int, то компилятор сформирует определение int abs(int x) и обращение в данном случае будет произведено именно к этой функции. При вызове функции f=abs(f), где f – переменная типа float, компилятор сформирует определение float abs(float x) и вызываться будет данная функция. Таким образом, механизм шаблонов автоматизирует подготовку перегруженных функций.

Свойства параметров шаблонов:

  1. Имена параметров шаблона должны быть уникальными во всем определении шаблона;

  2. Список параметров шаблона не может быть пустым;

  3. Объявление каждого параметра должно начинаться со слова class;

  4. Имя параметра шаблона имеет свойства и права типа, т.е. с помощью его можно специфицировать формальные параметры, тип функции, локальные переменные функции; имя параметра шаблона видно во всем определении функции и перекрывает область видимости типа с тем же именем.

  5. Все параметры шаблона функции должны быть обязательно использованы в сигнатуре определения функции. Т.е. недопустимо, например, определение

template <class A,class B>

B func(A n){…}

Здесь параметр В не был использован в спецификации формальных параметров.

В разных шаблонах функций имена параметров могут совпадать.

Функция, содержащая параметры, определяемые в шаблоне, может содержать любое количество не параметризованных формальных параметров и возвращать не параметризованное значение. Например:

Пример

template <class T>

T func(T x, int *b)

{*b=27; return x*x;}

int main()

{int a=5,b=3;

a=func(a,&b); //a=25, b=27

return 0;}

Шаблон функции может быть использован и при описании прототипа функции

template <class A>

void func(A);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]