Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL_PrJAVU230200.doc
Скачиваний:
22
Добавлен:
17.03.2015
Размер:
702.46 Кб
Скачать

Функции с параметрами по умолчанию

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

getline(char*p, int n, char s='\n');

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

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

Перегрузка функции

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

Использование нескольких функций с одним и тем же именем, но с разным списком параметров - называется перегрузкой функции. Список параметров должен отличаться либо количеством, либо типами, либо тем и другим. Тип функции не участвует в перегрузке. Компилятор определяет какую функцию вызвали по набору аргументов, при этом вызов должен быть однозначным.

Неоднозначность может возникнуть при:

1. Преобразовании типа

2. Использовании параметров ссылок

3. Использовании параметров по умолчанию

1

/

float f(float a);

double f(double a);

int main (void)

{

int a =...;

float b =...;

double c =...;

f (b);

f (c);

f (a); // неоднозначность. возникнет ошибка компиляции

f ((double)a); // таким образом можно устранить неоднозначность

return 0;

}

2

/

void f1(int a);

void f1(int&a);

int main (void)

{

int a =...;

f1(a); // неоднозначность

return 0;

}

3

/

void f2 (int a);

int f2 (int a, int b=3);

int main (void)

{

int a =...;

f2(a); // неоднозначность

return 0;

}

Шаблоны функции

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

template <class T>

имя функции

{

тело функции

}

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

Пример:

Написать функцию-шаблон для вывода двумерного массива на экран.

Функция должна выводить двумерный массив любого типа, следовательно, параметризованный тип выражает тип массива

shablon.h

----------------------

#ifndef SHABLON_H

#define SHABLON_H

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include <iomanip>

template <class T>

void OutMas(T*p,int n,int m) {

int i,j;

for (i=0; i<n;i++) {

for (j=0; j<m;j++) {

cout << setw(5) << *(p+i*m+j);

}

cout << endl;

}

return;

}

#endif

----------------------

main.cpp

----------------------

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include "shablon.h"

int main (void)

{

int A[2][3]= {1,2,3,4,5,6};

double B[3][3] = {1.5,2.6,3.7,4.8};

cout << "\n Целый массив:\n";

OutMas(A[0],2,3);

cout << "\n Дробный массив:\n";

OutMas(B[0],3,3);

return 0;

}

----------------------

При компиляции этой программы компилятор по вызову функции первый раз, определяет, что тип массива - целый и создает экземпляр функции OutMas, заменяя имя параметризованного типа T на int. Аналогично, видя вызов функции с типом массива - double, компилятор создает еще один экземпляр функции OutMas, заменяя T на double. Процесс создания экземпляра функции называется инстанцирование.

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

Например: OutMas <int>(A[0],2,3);

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