Лабораторная работа №2
Цель работы - познакомиться особенностями функций в на С++, работе с массивами
в консольном приложении Win32.
Перегрузка функций
Перегрузка (function overloading) – это определение двух или более функций с одинаковым именем, но разными наборами параметров.
Функции, имеющие общее имя, называются перегруженными (overloaded).
Функция multiply() в лаб. работе №1 принимала два целых числа, перемножала их и возвращала результат. Для перемножения вещественных чисел (с плавающей точкой) или типа short потребовались бы новые функции:
int multiplyInt(int x, int y);
float multiplyFloat (float x, float y);
short multiplyShort (short x, short y);
С помощью механизма перегрузки функций можно написать отдельные функции для каждого из этих объявлений, но с одним и тем же именем. Компилятор сам выберет нужную функцию, основываясь на аргументах, которые ей передаются.
Задание 1. Загрузите программу перемножения двух чисел и добавьте необходимые операторы для создания перегружённых функций multiply().
….
float multiply(float x,float y) // определение функции для типа float
{ return x*y; }
int multiply(int x, int y) // определение функции для типа int
{ return x*y; } // определение функции вывода результата для типа int
void showResult(int res)
{ cout << "The result is: "<< res << endl; }
void showResult(float res) // определение функции вывода результата для типа float
{ cout << "The result is: "<< res << endl; }
void main(int argc, char* argv[])
{ int x, y ;
float a,b;
x=2; y=5;
int result = multiply (x, y); // вызов функции
showResult(result);
a=2.5; b=3.5;
float res = multiply (a, b);
showResult(res);
cout << endl << endl << "Press any key to continue...";
getch();
}:
Нельзя создавать перегруженные функции, различающиеся только типом возвращаемого значения: int DoSomething(); и void DoSomething();
Компилятор выдаст ошибку: Type mismatch in redeclaration of ‘ ‘DoSomething();’ – несоответствие типов в повторном объявлении ‘DoSomething();’
Работа компилятора с перегруженными функциями основана на процессе, называемом искажением имён (name mangling).
Перегружённые функция надо вводить без неоднозначности в трактовке аргументов. Если это невозможно, можно воспользоваться приведение типов:
int x=3;
float b=3.5;
float res = multiply ((float)x, b);
Аргументы, передаваемые по умолчанию
Функции в С++ могут иметь аргументы по умолчанию (default parameters), которые используются при отсутствии явного указания аргумента при вызове функции. Продемонстрируем на предыдущим примере.
Задание №2.
Для определения аргументов, передаваемых по умолчанию откорректируйте нужные операторы:
float multiply(float x=7.2,float y=7.2) // по умолчанию
{ return x*y; }
….
float a,b;
.. a=2.5; b=3.5;
float res = multiply (a,b); // результат = 8.75, а
float res = multiply (); // результат = 51.84
Подставляемые функции
Обычно функция включается в исполняемый файл один раз. В дальнейшем она используется посредством вызовов. При этом в программе каждый раз происходит переход от точки вызова функции на начало этой функции.
Подставляемые функции (inline function) включается в исполняемый файл каждый раз, когда к ней происходит обращение.
Подставляемые функции объявляются подобно обычным функция, но с использование ключевого слова inline. Когда компилятор встречает в исходном тексте программы обращение к подставляемой функции, он помещает в исполняемый файл отдельную копию этой функции.