Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Proga (pechat).docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
90.29 Кб
Скачать

38. Понятие формальных параметров и фактических аргументов (при вызове ф-ции). Переменное число аргументов или аргументы с изменяющимися типами (многоточие).

Если ф-ция имеет аргументы, следует объявить переменные, которые будут принимать их зн-ия. Эти переменные называют формальными. Внутри ф-ции они ничем не отличаются от локальных.

Локальные переменные ф-ции размещаются в стеке, после окончания выполнения ф-ции стек-поинтер перейдет в начало стека, и область память, отводившаяся на лок. перем. снова станет «свободной».

Фактический параметр — аргумент, передаваемый в функцию при ее вызове.

int main(void){

myfunc(10,-4.5); //10, -4.5 -фактические параметры.

…}

myfunc (int a, float b)

{…

} //a, b – формальные парам-ы

Список выражений – это список фактических аргументов (любая величина основного типа, структура, перечисление, объединение или указатель, в том числе на массив или ф-цию)

При вызове вычисляются выражения в списке, сравниваются с типом соответствующих формальных парам-ов, если они не совпадают, то производится попытка преобразования к типу формального параметра, в случае неудачи – сообщение об ошибке, если эл-т в списке является вызовом ф-ции (суперпозиция), то он имеет тип и зн-ие возвращаемого рез-а ф-ции.

int f1(int k, char *, …); //ф-ция имеет переменное число парам, типы которых не контролируются в отличии от фиксированных парам-ов

printf( char * format, …);

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

Действенным механизмом языка С являются указатели на функции (function pointed). Несмотря на то что функция не является переменной , она располагается в памяти, и , следовательно, ее адрес можно присваивать указателю. Этот адрес считается точкой входа в функцию. Именно он используется при ее вызове. Поскольку указатель может ссылаться на функцию, ее можно вызвать с помощью этого указателя. Это также позволяет передавать функции другим функциям в качестве аргументов.

Адрес функции задается ее именем, указанным без скобок и аргументов.

Пример: #include<iostream> using namespace std; int plus(int a, int b); int minus(int a, int b); int multiplication(int a, int b); int main() {   int select;    int a,b;    cout<<"Enter a\n";    cin>>a;    cout<<"Enter b\n";    cin>>b;    typedef int (*PF)(int,int);    cout<<"Choose option:\n0  +\n1 -\n2 *\n";    PF option[]={&plus, &minus,&multiplication};    cin>>select;    cout<<"Result:\n";    cout<<option[select](a,b);} int plus(int a, int b)

{ return a+b; } int minus(int a, int b)

{ return a-b; } int multiplication(int a, int b)

{ return a*b; }

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

Использование одного имени для похожих действий над различными типами параметров называется перегрузкой функции: ·         void print(int); ·         void print(char*); Порядок поиска функции среди перегруженных: 1.       Если точного соответствия типов не найдено, то выполняется приведение младшего типа к старшему: char в int, float в double и т.д. 2.       Далее выполняются стандартные преобразования типов, например int в double, указатель в void. 3.       Далее выполняется преобразования типов, заданные пользователем, а также поиск соответствий за счет переменного числа аргументов функций. Если соответствие может быть получено на данном этапе более, чем одним способом, то вызов считается неоднозначным, и выдается сообщение об ошибке. Неоднозначности могут появится при: ·         Преобразовании типа; ·         Использовании параметров-ссылок; ·         Использовании аргументов по-умолчанию. Правила преобразования типов применяются не полностью, остаются: ·         int -> long; ·         int -> double; ·         0 -> long; ·         0 -> double; ·         0 -> void* ·         Указатель на производный класс -> указатель на базовый класс. При перегрузке учитываются следующие ограничения: 1)      Не могут перегружаться функции, имеющие одинаковые типы параметров, но разные типы возвращаемых значений: int max(int,*int); int *max(int,*int); float max(int,*int); 2)      Не могут перегружаться функции, имеющие неявно-совпадающие типы параметров, например int <=> &int, float <=> &float: Пример: #include <iostream.h> int func1(int a, int b); float func1(float a, float b); void main(void) {int a=25, b=40; float c=2.45, d=6.15; cout<<”\ n Sum=”<<func1(a,b); cout<<”\n Разность =”<<func1(c,d); } int func1(int p1, int p2) {return (p1+p2);} float func1(float t1, float t2) {return (t1-t2);}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]