Цель лекции: изучить подставляемые (встраиваемые) функции и
Вызов функции, передача в нее значений, возврат значения – эти операции занимают довольно много процессорного времени. Обычно при определении функции компилятор резервирует в памяти только один блок ячеек для сохранения ее операторов. После вызова функции управление программой передается этим операторам, а по возвращении из функции выполнение программы возобновляется со строки, следующей после вызова функции.
При неоднократных вызовах каждый раз программа будет отрабатывать один и тот же набор команд, не создавая копий для каждого вызова в отдельности.
Каждый переход к области памяти, содержащей операторы функции, замедляет выполнение программы. Если функция занимает небольшой объем, то можно получить выигрыш во времени при многократных вызовах, дав компилятору команду встроить код функции непосредственно в программу по месту вызова. Такие функции называется подставляемыми. В этом случае, говоря об эффективности, прежде всего, подразумевается скорость выполнения программы.
Подставляемые или встраиваемые (inline) функции – это
Если функция является подставляемой, компилятор не создает данную функцию в памяти, а копирует ее строки непосредственно в код программы по месту вызова. Это равносильно вписыванию в программе соответствующих блоков вместо вызовов функций. Таким образом, определяет для функции так называемое внутреннее связывание, которое заключается в том, что компилятор вместо вызова функции подставляет команды ее кода. Подставляемые функции используют, если тело функции состоит из нескольких операторов.
Этот подход позволяет увеличить скорость выполнения программы, так как из программы исключаются команды
Например:
/*функция возвращает расстояние от точки с координатами(x1,y1) до точки с координатами (x2,y2)*/
inline float Line(float x1,float y1,float x2, float y2) {
return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
Однако следует обратить внимание, что использование подставляемых функций не всегда приводит к положительному эффекту. Если такая функция вызывается в программном коде несколько раз, то во время компиляции в программу будет вставлено столько же копий этой функции, сколько ее вызовов. Произойдет значительное увеличение размера программного кода, в результате чего ожидаемого повышения эффективности выполнения программы по времени может и не произойти.
Пример 1.
#include "stdafx.h"
#include <iostream>
using namespace std;
inline int Cube(int x);
int _tmain(int argc, _TCHAR* argv[]){
int x=2;
float y=3;
double z=4;
cout<<Cube(x)<<endl;
cout<<Cube(y)<<endl;
cout<<Cube(z)<<endl;
system("pause");
return 0;
}
inline int Cube(int x) {
return x*x*x;
}
Перечислим причины, по которым функция со спецификатором
Ограничения на выполнение подстановки в основном зависят от реализации. Если же для функции со спецификатором компилятор не может выполнить подстановку из-за контекста, в который помещено обращение к ней, то функция считается статической и выдается
Еще одной из особенностей подставляемых функций является невозможность их изменения без перекомпиляции всех частей программы, в которых эти функции вызываются.
При определении функций в программах необходимо указывать тип возвращаемого функцией значения, а также количество параметров и тип каждого из них. Если на языке С++ была написана функция с именем add_values, которая работала с двумя целыми значениями, а в программе было необходимо использовать подобную функцию для передачи трех целых значений, то тогда следовало бы создать функцию с другим именем. Например, add_two_values и add_three_values. Аналогично, если необходимо использовать подобную функцию для работы со значениями типа float, то нужна еще одна функция с еще одним именем. Чтобы избежать дублирования функции, C++ позволяет определять несколько функций с одним и тем же именем. В процессе компиляции C++ принимает во внимание количество аргументов, используемых каждой функцией, и затем вызывает именно требуемую функцию. Предоставление компилятору выбора среди нескольких функций называется
Перегрузка функций – это создание нескольких функций с одним именем, но с разными параметрами. Под разными параметрами понимают, что должно быть разным количество аргументов функции и/или их тип. То есть
Под
Таким образом, благодаря использованию
Например, следующая программа перегружает функцию с именем add_values. Первое определение функции складывает два значения типа int. Второе определение функции складывает три значения типа int. В процессе компиляции C++ корректно определяет функцию, которую необходимо использовать:
#include "stdafx.h"
#include <iostream>
using namespace std;
int add_values(int a,int b);
int add_values (int a, int b, int c);
int _tmain(int argc, _TCHAR* argv[]){
cout << "200+801=" << add_values(200,801) << "\n";
cout << "100+201+700=" << add_values(100,201,700) << "\n";
system("pause");
return 0;
}
int add_values(int a,int b) {
return(a + b);
}
int add_values (int a, int b, int c) {
return(a + b + c);
}
Таким образом, программа определяет две функции с именами add_values. Первая функция складывает два значения, в то время как вторая складывает три значения одного типа int. Компилятор языка С++ определяет, какую функцию следует использовать, основываясь на предлагаемых программой параметрах.
Одним из наиболее общих случаев использования day_of_week, которая возвращает текущий день недели (0 для воскресенья, 1 для понедельника, ... , 6 для субботы). Программа могла бы перегрузить эту функцию таким образом, чтобы она верно возвращала день недели, если ей передан юлианский день в качестве параметра, или если ей переданы день, месяц и год.
int day_of_week(int julian_day) {
// операторы
}
int day_of_week(int month, int day, int year) {
// операторы
}
При использовании
int имя_функции(int имя_аргумента); int имя_функции(int имя_аргумента); /*недопустимая перегрузка имени: аргументы имеют одинаковое количество и одинаковый тип*/
Пример 2.
/*Перегруженные функции имеют одинаковые имена, но разные списки параметров и возвращаемые значения*/
#include "stdafx.h"
#include <iostream>
using namespace std;
int average(int first_number, int second_number, int third_number);
int average(int first_number, int second_number);
int _tmain(int argc, _TCHAR* argv[]){// главная функция
int number_A = 5, number_B = 3, number_C = 10;
cout << "Целочисленное среднее чисел " << number_A << " и ";
cout << number_B << " равно ";
cout << average(number_A, number_B) << ".\n\n";
cout << "Целочисленное среднее чисел " << number_A << ", ";
cout << number_B << " и " << number_C << " равно ";
cout << average(number_A, number_B, number_C) << ".\n";
system("PAUSE");
return 0;
}// конец главной функции
/*функция для вычисления целочисленного среднего значения 3-х целых чисел*/
int average(int first_number, int second_number, int third_number ) {
return((first_number + second_number + third_number)/3);
} // конец функции
/*функция для вычисления целочисленного среднего значения 2-х целых чисел*/
int average( int first_number, int second_number ) {
return((first_number + second_number)/2);
} // конец функции
Пример 3.
/*Перегруженные функции имеют одинаковые имена и типы возвращаемых значений, но разные типы параметров*/
#include "stdafx.h"
#include <iostream>
using namespace std;
#include<stdio.h>
float average(int first_number, int second_number,
int third_number );
float average(float first_number, float second_number,
float third_number);
int _tmain(int argc, _TCHAR* argv[]){
int A = 5, B = 3, C = 10;
float A1 = 5.1, B1 = 3.4, C1 = 10.5;
printf("Среднее значение 3-х целых чисел = %f\n",
average(A,B,C)/3.0);
printf("Среднее значение 3-х вещественных чисел = %f\n",
average(A1,B1,C1)/3.0);
system("pause");
return 0;
}
/*функция для вычисления среднего значения 3-х целых чисел*/
float average(int first_number, int second_number,
int third_number ) {
return ((first_number + second_number + third_number));
}
/*функция для вычисления среднего значения 3-х веществен-ных чисел*/
float average(float first_number, float second_number,
float third_number) {
return ((first_number + second_number + third_number));
}
Внутреннее связывание – это подстановка компилятором вместо вызова функции команд ее кода.
Перегрузка функций – это создание нескольких функций с одним именем, но с разными параметрами.
Подставляемые или встраиваемые (inline) функции – это
Полиморфизм функций – это
Цель работы: изучить подставляемые (встраиваемые) функции и
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе числовые данные, выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи (ввод данных сопровождайте диалогом). Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке С++.
Теоретические сведения.
Ознакомьтесь с материалом лекции 2.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами обработки числовых данных в языке С++. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, используя
Следует реализовать каждое задание в соответствии с приведенными этапами:
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.