- •7.1. Два подхода к передаче аргументов
- •1. Пример передачи аргументов по значению
- •2. Пример передачи аргументов по ссылке
- •3. Пример передачи аргументов по ссылке и по значению одновременно
- •7.2. Перегрузка функций
- •1. Программный пример перегрузки функций
- •2. Программный пример перегрузки функций
- •3. Программный пример перегрузки функций
- •7.3. Шаблоны функций
- •7.3.1. Родовые функции
- •7.3.2. Функция с двумя родовыми типами
- •7.4. Рекурсия
3. Программный пример перегрузки функций
Другое преимущество перегрузки функций заключается в возможности определять слегка различающиеся варианты одной и той же функции, каждый из которых предназначен для определенного типа данных. В качестве примера рассмотрим функцию с именем min( ), которая находит меньшее из двух значений. Нетрудно написать варианты min(), которые будут выполняться по-разному для данных различных типов. Сравнивая два целых числа, min( ) вернет меньшее из них. Сравнивая два символа, min( ) может вернуть букву, стоящую в алфавите ранее другой, независимо от того, прописные эти буквы или строчные. В таблице ASCII прописные буквы имеют значения, на 32 меньшие, чем соответствующие строчные. Таким образом, игнорирование регистра букв может быть полезным при упорядочении по алфавиту. Сравнивая два указателя, можно заставить min( ) сравнивать значения, на которые указывают эти указатели, и возвращать указатель на меньшее из них. Ниже приведена программа, реализующая все эти варианты min( ):
// demoOverload4.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <conio.h>
int min(int a, int b); // min() для int
char min (char a, char b) ; // min () для char
int * min(int *a, int *b); // min () для int*
int main(){
int i = 10, j =22;
cout << "min('X', 'a') : " << min('X' , 'a') << "\n";
cout << "min(9, 3): " <<min(9, 3) << "\n";
cout << "*min(&i, &j) : " << *min(&i, &j) << "\n";
getch();
return 0;
}
// min() для int. Возвращает меньшее значение.
int min (int a, int b)
{
if (a < b) return a;
else return b;
}
// min() для char - игнорирование регистра букв.
char min (char a, char b)
{
if(tolower(a) < tolower(b)) return a;
else return b;
}
/*
min() для указателей на int.
Сравнивает значения и возвращает указатель на меньшее значение.*/
int * min (int *a, int *b)
{
if (*a < *b) return a;
else return b;
}
Вот вывод этой программы:
Когда вы перегружаете функцию, каждый вариант этой функции может выполнять любые нужные вам действия. Нет никаких правил, устанавливающих, что перегруженные функции должны быть похожими друг на друга. Однако с точки зрения стиля перегрузка функции предполагает их взаимосвязь. Поэтому, хотя вы и можете дать одно и то же имя перегруженным функциям, выполняющим совсем разные действия, этого делать не следует. Например, вы можете выбрать ими sqr() для функций, одна из которых возвращает квадрат int, а другая - квадратный корень из значения double. Однако эти две операции фундаментально различаются, и использование для них понятия перегрузки функций противоречит исходной цели этого средства. (Такой способ программирования считается исключительно дурным стилем!) В действительности перегружать следует только тесно связанные операции.
7.3. Шаблоны функций
Шаблон является одним из наиболее сложных и мощных средств С++. Шаблонов не было в исходных спецификациях С++; они были добавлены лишь несколько лет назад и поддерживаются всеми современными компиляторами С++. Шаблоны помогают вам достичь одной из самых трудноуловимых целей в программировании: созданию повторно используемого кода.
Использование шаблонов позволяет создавать родовые (типовые, обобщенные) функции. В родовой функции тип данных, с которыми работает функция, задается с помощью параметра. Таким образом, вы можете использовать одну функцию для обработки данных различных типов вместо того, чтобы создавать специфические варианты кода для каждого типа данных.
