1 / 13

Лекция 6

Лекция 6. Функции. Объявления и определения. Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание набора инструкций, составляющих тело функции Чтобы использовать функцию, необходимо ее объявить

irisa
Download Presentation

Лекция 6

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Лекция 6 Функции

  2. Объявления и определения • Объявление функции – указание имени функции, а также входных и выходных параметров • Определение функции – указание набора инструкций, составляющих тело функции • Чтобы использовать функцию, необходимо ее объявить • Объявление функции может встречаться в теле программы несколько раз • Определение функции может встречаться в теле программы не более одного раза • Определение включает в себя объявление

  3. Объявление функции • Формат модификаторы возвращаемый_тип имя ( список_аргументов ); • Примеры void process (); void undo ( void ); int sum ( int a, int b ); const char* find ( const char *, char letter );

  4. Определение функции • Формат объявление функции { инструкции } • Примеры int sum ( int a, int b ){ return a + b ; } const char* find ( const char * str, char letter ) { for ( ; *str; str++ ) if ( *str == letter ) returnstr ; return NULL; }

  5. Модификатор inline • Рекомендует компилятору замещать вызов функции ее телом • Указывается только в определениях функций • Определение функции с inlineможет повторяться более одного раза inline int sum ( int a, int b ){ return a + b ; } intmain () { return sum ( 4, 7 ); }

  6. Передача аргументов • Входные параметры функции называютя ее аргументами • Для каждого аргумента создается локальная переменная • Значения, указанные при вызове функции, копируются в эти локальные переменные • В объявлении функции можно не указывать имена аргументов • В определении функции нельзя использовать необъявленное имя int sum ( int, int ); int sum ( int a, int b ) { return a + b ; } intmain () { int a = 7 ; int b = 9 ; return sum ( b, a ); }

  7. Передача с помощью адресных типов void sum1 (inta, int b) { a += b ; } void sum2 (int& a, int b) { a += b ; } void sum3 (int* a, int b) { *a += b ; } void main () { int a = 3, b = 5 ; sum1 ( a, b ); sum2 ( a, b ); sum3 ( &a, b ); } Виды передачи • Передача по значению • Передача по ссылке • Передача по адресу

  8. Использование constв аргументах void f1 ( inta ) { a = 5 ; } void f2 ( int const a ) { a = 5 ; } void f3 ( int*a ) { *a = 5 ; } void f4 ( int*const a ) { *a = 5 ; } void f5 ( int const *a ) { *a = 5 ; } void f6 ( int & a ) { a = 5 ; } void f7 ( int const &a ){ a = 5 ; } void main () { int a = 3 ; f1( a ); f2( a ); f3(&a); f4(&a); f5(&a); f6(a);f7(a); } Использование константных ссылок и константных указателей подразумевает, что их «адресат» не изменится в теле функции

  9. Аргументы - массивы • Массивы можно указывать в качестве аргументов и возвращаемых значений • Фактически передается только адрес первого элемента массива. Массивы нельзя передавать по значению void f1 ( inta[3] ) { a[1] = 5 ; } void f2 ( inta[] ) { a[1] = 5 ; } void f2 ( inta[][4] ) { a[1][2] = 5 ; } void main () { int a[3]; f1 (a); f2(a); int b[4][4]; f3 (b); }

  10. Аргументы по умолчанию • Позволяют указывать не полное количество аргументов при вызове • Указываются всегда в конце списка • Не могут быть изменены в последующих объявлениях void f1 ( inta = 0, int b = 5 ); void f2 ( inta = 0, int b ); void f3 ( int*a = 0 ); void f3 ( int* = 0 ); void f3 ( int*a = 3 );

  11. Неуказанные аргументы #include <stdarg.h> void error ( int code, ... ) { va_listap ; va_start ( ap, code ); while(1) { char * p = va_arg(ap,char*); if ( !p ) break ; std::cout << p ; } va_end(ap); } • Указываются в конце списка аргументов • Типы не проверяются компилятором • Требует восстановления стека

  12. Возвращаемые значения int f () { return 4 ; } int max ( int a, int b ) { if ( a > b ) return a ; return b ; } int max2 ( int a, int b ) { return a > b ? a : b ; } void f () { } void g () { return f(); } • Возвращаемое значение задается инструкцией return. • Функция, объявленная как void, не должна возвращать значения • Функция, объявленная как void, может вернуть значение другой объявленной как voidфункции • Функция, объявленная иным типом, обязана вернуть значение данного типа • Возврат всегда осуществляется по значению

  13. Указатели на функцию • Имя функции совпадает с указателем на нее • Вызов функции с помощью оператора () применим как к имени, так и к указателю на нее void sum ( int ){} void (*pfn) ( int ); typedefvoidfn_t ( int ); typedeffn_t* pfn_t ; void main () { pfn = &sum ; pfn = sum ; pfn_t fn = &sum ; pfn_tfo = sum ; fn( 3 ); pfn( 5 ); }

More Related