Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 7_Подробнее о функциях.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
289 Кб
Скачать
☆

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. Шаблоны функций

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

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