Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №2 New1.doc
Скачиваний:
4
Добавлен:
17.08.2019
Размер:
100.86 Кб
Скачать

8

Лабораторная работа №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. Когда компилятор встречает в исходном тексте программы обращение к подставляемой функции, он помещает в исполняемый файл отдельную копию этой функции.