Содержание

Слайд 2

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

typedef int myint;
void f(myint g){
cout<}
void f(int g){
cout<}
int main(){
myint t=4;
f(t);
}

Перегрузка функций typedef int myint; void f(myint g){ cout } void f(int

Слайд 3

Формы рекурсивных функций

1. С выполнением действий на рекурсивно спуске
void func(); { S; if

Формы рекурсивных функций 1. С выполнением действий на рекурсивно спуске void func();
(условие) func(); }
2. С выполнением действий на рекурсивном возврате: void func(); { if (условие) {func(); S;} } 3. С выполнением действий как на рекурсивном спуске, так и на рекурсивном возврате: void func(); { S1; if (условие) {func(); S2;} } void func(); { if( условие) {S1; func(); S2;} }

Слайд 4

Виды рекурсий

Прямая рекурсия – функция содержит вызовы самой себя. Косвенная рекурсия –

Виды рекурсий Прямая рекурсия – функция содержит вызовы самой себя. Косвенная рекурсия
функция вызывает себя через вызов в другой функции

Слайд 5

Встроенные функции inline

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

Встроенные функции inline Вызов функции заменяется ее содержимым(но увеличивается компилируемый код) Используют
функций
Компилятор может отклонить запрос…(например, если функция длинная)
Компилятор автоматически конвертирует в inline…
-> нет необходимости в использовании inline
Замечание: не действует правило не определять в заголовочных файлах…!

Слайд 6

Встроенные функции

void f()
{
cout<<5;
}
int main()
{
f();
f();
}

inline void

Встроенные функции void f() { cout } int main() { f(); f();
f()
{
cout<<5;
}
//при компиляции код:
int main()
{
cout<<5;
cout<<5;
}

Слайд 7

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

Определение функций с одним именем, но разными параметрами
Тип возврата не учитывается

Перегрузка функций Определение функций с одним именем, но разными параметрами Тип возврата
при перегрузке:
int f(){
int b=4;
return b;
}
double f(){
double c =8.0;
return c;}
int main(){
int c=f();
cout<

Слайд 8

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

typedef int myint;// псевдоним типа
void f(myint g){
cout<}
void f(int g){
cout<}
int main(){
myint

Перегрузка функций typedef int myint;// псевдоним типа void f(myint g){ cout }
t=4;
f(t);
}

Слайд 9

Параметры по умолчанию

void f(int t, int p=34);
int main(){
f(6);
}
void f(int t,

Параметры по умолчанию void f(int t, int p=34); int main(){ f(6); }
int p=34){ //проблема…
cout<}

Слайд 10

Параметры по умолчанию

int g=5;
int sqr(int x)
{return x*x}
void f(int t, int p=(++g, sqr(g)));
int

Параметры по умолчанию int g=5; int sqr(int x) {return x*x} void f(int
main(){
f(6);
}
void f(int t, int p){ //проблема…
cout<}

Слайд 11

Указатели на функции

Псевдонимы типов
using ff=int(*)(int,int);
//typedef int(*ff)(int,int);
int plus(int x, int y){
return x+y;
}
int

Указатели на функции Псевдонимы типов using ff=int(*)(int,int); //typedef int(*ff)(int,int); int plus(int x,
mult(int x,int y){
return x*y;
}
int myop(int x, int y, ff f){
return (*f)(x,y);
}
int main(){
int a=2,b=4;
cout<}

Слайд 12

Указатели на функцию

#include
using namespace std;
int plus(int x, int y){
return x+y;
}
int

Указатели на функцию #include using namespace std; int plus(int x, int y){
mult(int x,int y){
return x*y;
}
int myop(int x, int y, std::function f){
return f(x,y);
}int main(){
int a=2,b=4;
cout<}

Слайд 13

Аргументы командной строки

Доступ к аргументам командной строки из программы
int main(int argc, char

Аргументы командной строки Доступ к аргументам командной строки из программы int main(int
*argv[]);
int main(int argc, char **argv);
argc – argument count(кол-во аргументов переданных в программу: имя программы – это первый аргумент);
argv-argument values (значения аргументов)
Аргументы командной строки передаются как строки

Слайд 14

assert

Макрос препроцессора для обработки условного выражения во время выполнения
#include
using namespace std;
void

assert Макрос препроцессора для обработки условного выражения во время выполнения #include using
f(int i){
assert(i>=5 && i<10); //программа завершится при ложном условии
cout<int main(){
f(24);
}
Удобно использовать в функциях для проверки параметров и возвращаемого значения

Слайд 15

assert

#include
using namespace std;
void f(int i){
assert((i>=5 && i<10) && " error

assert #include using namespace std; void f(int i){ assert((i>=5 && i cout
i"); //программа завершится при ложном условии
cout<int main(){
f(56);
}
Обычно assert не включают в релиз
#define NDEBUG отключит все assert

Слайд 16

static_assert

Вызывает ошибку при ложном условии во время компиляции
#include
using namespace std;
int

static_assert Вызывает ошибку при ложном условии во время компиляции #include using namespace
main(){
const int t= 5;
static_assert(t==7, " Error t");
cout<}

Слайд 17

exit

Если необходимо завершить программу, то используйте exit()
// Example program
#include
#include
#include

exit Если необходимо завершить программу, то используйте exit() // Example program #include

using namespace std;
void f(int t){
if (t>4) exit(0);
cout<int main(){
f(7);
}

Слайд 18

Плохая функция, возвращающая ссылку

int & func(int i)
{ return i;}
int & func1(int &i) {

Плохая функция, возвращающая ссылку int & func(int i) { return i;} int
return i;}
int main()
{
int p= 5;
cout<}
Замечание: возврат ссылки на статическую переменную

Слайд 19

Левые функции

// Example program
#include
using namespace std;
int &mymin(int n, int *a){

Левые функции // Example program #include using namespace std; int &mymin(int n,
int id=0;
for(int i=1;i id=a[id] return a[id];
}
int main(){
int a[]{4,7,3,9,12};
mymin(5, a)=100;
cout<}

Слайд 20

Левые функции

// Example program
#include
using namespace std;
int *mymin(int n, int *a){
int

Левые функции // Example program #include using namespace std; int *mymin(int n,
id=0;
for(int i=1;i id=a[id] return &a[id];
}
int main(){
int a[]{4,7,3,9,12};
*mymin(5, a)=100;
cout<}

Слайд 21

Левые функции. Маленькая задача

Написать функцию, возвращающую указатель на минимум из двух чисел

Левые функции. Маленькая задача Написать функцию, возвращающую указатель на минимум из двух

С++ позволяет запретить использовать функцию как левую: const…

Слайд 22

Функции с переменным числом параметров

Тип имя_функции(аргументы…)
Необходимо разработать алгоритм доступа к параметрам…

Функции с переменным числом параметров Тип имя_функции(аргументы…) Необходимо разработать алгоритм доступа к параметрам…

Слайд 23

Функции с переменным числом параметров

double f(double n,...)//считаем что 0 в конце
{ double

Функции с переменным числом параметров double f(double n,...)//считаем что 0 в конце
*p=&n;//настроили на начало списка
double sum=0;
double count=0;
while(*p) {
sum+=(*p);
p++;
count++; }
return ((sum)?sum/count:0.0);
cout< cout<int main() {
double t = f(4.0,8.0,3.0,10.0,0);
cout<

Слайд 24

Функции с переменным числом параметров

using namespace std;
double f(int n,...)
{ int *p=&n;//настроили на

Функции с переменным числом параметров using namespace std; double f(int n,...) {
начало списка
p++; //настраиваем на тип double
double *pp=(double*)p; double sum=0;
double count =n;
for(;n--;pp++)
{ sum+=(*pp);
}
return ((sum)?sum/count:0.0);
}
int main() {
double t = f(4.0,8.0,3.0,10.0,0);
cout<}

Слайд 25

Функции с переменным числом параметров

using namespace std;
double f(double *n,...)//считаем что нулевой указатель

Функции с переменным числом параметров using namespace std; double f(double *n,...)//считаем что
в конце
{
double **p=&n;//адрес адреса
double sum=0;
double count=0;
while(*p!=nullptr){
sum+=(**p);
p++;
count++;
}
return ((sum)?sum/count:0.0);
}
int main() {
double a=8.0, b=4.0;
double t = f(&a,&b,nullptr);
cout<}

Слайд 26

Функции с переменным числом параметров. Макросы

stdarg.h
va_list определяем тип указателя
va_start устанавливает указатель типа

Функции с переменным числом параметров. Макросы stdarg.h va_list определяем тип указателя va_start
va_list на явный параметр
va_arg перемещает указатель на следующий параметр
va_end обнуляет указатель

Слайд 27

Функции с переменным числом параметров. Макросы

Как работает:
Обьявляем объект типа va_list – как

Функции с переменным числом параметров. Макросы Как работает: Обьявляем объект типа va_list
указатель…
Инициализируем указатель с помощью va_start. Va_list связывается с последним явным параметром (перед многоточием)
Передвигаемся с помощью va_arg по списку параметров. Тип параметров надо явно указать.
После всей обработки вызывается va_end

Слайд 28

Функции с переменным числом параметров. Макросы

// Example program
#include
#include
#include
using namespace

Функции с переменным числом параметров. Макросы // Example program #include #include #include
std;
double f(int n, double a,...)//считаем что 0 в конце
{
va_list p;//указатель обьявлен
double sum=a;
double count=0;
va_start(p, a);// инициализировали указатель
while(n--) {
sum+=va_arg(p, double);
count++;
}
va_end(p);
return ((sum)?sum/count:0.0);}
int main() {
double t = f(3, 4.0,8.0,3.0);
cout<

Слайд 29

Функции с переменным числом параметров. Макросы

#include
using namespace std;
double f(int n, double

Функции с переменным числом параметров. Макросы #include using namespace std; double f(int
a,...)
{ va_list p;//указатель обьявлен
double sum=a;
double count=0;
va_start(p, a);// инициализировали указатель
while(n--) {
sum+=va_arg(p, double);
count++;
}
va_end(p);
return ((sum)?sum/count:0.0);}
int main() {
double t = f(3, 6.0,7.0,5.0);
cout<}
Имя файла: Lektsia_7.pptx
Количество просмотров: 24
Количество скачиваний: 0