Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Перегрузка функций.doc
Скачиваний:
10
Добавлен:
16.07.2019
Размер:
90.11 Кб
Скачать

Тема 2.5. Перегрузка функций. Перегрузка операторов.

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

При определении функций в программах необходимо указать тип возвращаемого функцией значения, а также количество параметров и тип каждого из них. Например, имеется функция с именем add_values, которая складывает два целых числа, а нам необходимо использовать данную функцию для сложения трех целых значений, то логично, что нужно создать функцию с другим именем. Например, вы могли бы использовать add_two_values и add_three_values. Аналогично если вы хотели использовать подобную функцию для сложения значений типа float, то вам была бы необходима еще одна функция с еще одним именем. Чтобы избежать дублирования функции, C++ позволяет определять несколько функций с одним и тем же именем. В процессе компиляции C++ принимает во внимание количество аргументов, используемых каждой функцией, и затем вызывает именно требуемую функцию. Предоставление компилятору выбора среди нескольких функций называется перегрузкой.

Основные концепции:

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

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

Перегрузка функций является особенностью языка C++, которой нет в языке С. Перегрузка функций достаточно удобна и может улучшить удобочитаемость программ.

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

#include <iostream.h>

int add_values(int a,int b)

{

return(a + b);

)

int add_values (int a, int b, int c)

(

return(a + b + c);

)

void main(void)

{

cout << "200 + 801 = " << add_values(200, 801) << endl;

cout << "100 + 201 + 700 = " << add_values(100, 201, 700) << endl;

}

Как видите, программа определяет две функции с именами add_values Первая функция складывает два значения типа int, в то время как вторая складывает три значения. Вы не обязаны что-либо предпринимать специально для того, чтобы предупредить компилятор о перегрузке, просто используйте ее. Компилятор разгадает, какую функцию следует использовать, основываясь на предлагаемых программой параметрах.

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

#include <iostream.h>

void show_message(void)

{

cout << "Стандартное сообщение: " << "Учимся программировать на C++" << endl;

}

void show_message(char *message)

{

cout << message << endl;

}

void show_message(char *first, char *second)

{

cout << first << endl;

cout << second << endl;

}

Void main(void)

{

show_message();

show_message("Учимся программировать на языке C++!");

show_message("B C++ нет предрассудков!","Перегрузка - это круто!") ;

Вывод:

Перегрузка функций C++ позволяет программам определять несколько функций с одним и тем же именем. Перегруженные функции должны возвращать значения одинакового типа*, но могут отличаться количеством и типом параметров. До появления перегрузки функций в C++ программисты языка С должны были создавать несколько функций с почти одинаковыми именами. К сожалению, программисты, желающие использовать такие функции, должны были помнить, какая комбинация параметров соответствует какой функции. С другой стороны, перегрузка функций упрощает задачу программистов, требуя, чтобы они помнили только одно имя функции.

Перегрузка операторов.

Как вы уже знаете, тип переменной определяет набор значений, которые она может хранить, а также набор операций, которые можно выполнять над этой переменной. Например, над значением переменной типа int ваша программа может выполнять сложение, вычитание, умножение и деление. С другой стороны, использование оператора плюс для сложения двух строк лишено всякого смысла. Когда вы определяете в своей программе класс, то по существу вы определяете новый тип. А если так, C++ позволяет вам определить операции, соответствующие этому новому типу.

Перегрузка оператора состоит в изменении смысла оператора (например, оператора плюс (+), который обычно в C++ используется для сложения) при использовании его с определенным классом. Далее определим класс string и перегрузим операторы плюс и минус. Для объектов типа string оператор плюс будет добавлять указанные символы к текущему содержимому строки. Подобным образом оператор минус будет удалять каждое вхождение указанного символа из строки.

Основные концепции:

  • Операторы перегружаются для улучшения удобочитаемости программ, но перегружать операторы следует только в том случае, если это упрощает понимание программы.

  • Для перегрузки операторов используют ключевое слово C++ operator.

Переопределяя оператор, вы указываете функцию, которую C++ вызывает каждый раз, когда класс использует перегруженный оператор. Эта функция, в свою очередь, выполняет соответствующую операцию.

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

C++ позволяет перегружать большинство операторов, за исключением четырех.

Перегрузка операторов плюс и минус.

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

Ниже приведено определение класса, создающее класс string. Этот класс содержит один элемент данных, который представляет собой собственно символьную строку. Кроме того, этот класс содержит несколько различных методов и пока не определяет каких-либо операторов:

class string

{

public:

string(char *); // Конструктор

void str_append(char *);

void chr_minus(char);

void show_string(void);

private:

char data[256];

};

Как видите, класс определяет функцию str_append, которая добавляет указанные символы к содержимому строки класса. Аналогичным образом функция chr_minus - удаляет каждое вхождение указанного символа из строки класса. Следующая программа использует класс string для создания двух объектов символьных строк и манипулирования ими.

#include <iostream.h>

#include <string.h>

#include <conio.h>

class str

{

public:

str(char *);

void str_append(char *);

void chr_minus(char);

void show_string(void);

private:

char data[256] ;

};

str::str(char *str)

{

strcpy(data, str);

}

void str::str_append(char *str)

{

strcat(data, str);

}

void str::chr_minus(char letter)

{

char temp[256] ;

int i, j;

j = 0;

for (i = 0; data[i]!=0; i++){

if (data[i] != letter){

temp[j++] = data[i]; }

temp[j] = 0;

strcpy(data, temp);

}

}

void str::show_string(void)

{

cout << data << endl;

}