Доклад - функция с - компютърни науки, програмиране

Обичайният начин да се направи нещо в програмата за C ++ - е да извикате функция, която прави това. дефиниция на функция е начин да се питам как трябва да се направят някои действия. Функцията не може да се ползва, стига да не е описана.







Описание на функцията определя името на функцията, тип на връщане от функция стойност (ако има такива) и броя и вида на параметрите, които трябва да бъдете във функция разговор.

екстернант двойно SQRT (двойно);

екстернант ELEM * next_elem ();

екстернант знак * strcpy (знак * да, конст * CHAR от);

екстернант невалидни изход (междинно съединение);

Семантика предавателни параметри идентичен семантиката инициализация. Параметрите видове се проверяват, а когато е необходимо, направени за мълчалив тип реализация. Например, ако бяха дадени на предишните дефиниции, на

двойно SR2 = SQRT (2);

правилно да се отнася до функцията SQRT () със стойността на плаваща точка 2.0. Стойността на такъв тип проверка на типа реализация и е огромен.

Описание на функциите може да съдържа имената на параметри. Това може да помогне на читателя, но компилаторът просто игнорира тези имена.

Всяка функция, която се нарича в програмата трябва да бъдат дефинирани някъде (само веднъж). определение Function - това описание на функцията, която кара тялото да функционира.

ученик невалидни суап (инт *, вътр *); // описание

невалидни размяна (междинно *, Int *) // определение

За да се избегне харчат функция на повикване, функцията може да бъде описан като вграден, а да се осигури по-бърз достъп до параметрите, те могат да бъдат описани като регистър. И двата инструмента може да се злоупотребява, и трябва да се избягва, когато има някакво съмнение за тяхната полезност.

При активиране на функцията се нарича, допълнителна памет се разпределя съгласно нейните формални параметри, а всеки формален параметър се инициализира с отговарящия му застроена аргумент. Семантика предавателни параметри идентичен семантиката инициализация. По-специално, вида на действителния параметър е свързан с вида на формалната параметър, и изпълнява всички стандартни и някои видове превръщане употреба. Има специални правила за вектори за пренос, ще означава да подадете параметър, без да провери и средства за определяне на параметрите по подразбиране.

невалидни е (междинно Val, Int код)

Когато се нарича F (), Вал ++ увеличава локалното копие на първия действителен параметър, докато изх ++ увеличава втората действителния параметър.

невалидни е (конст голям арг)

// стойност на «арг» не може да се променя

По подобен начин, описанието на начина CONST индекс параметър казва на читателя, че стойността на обекта е посочено от функцията на показалеца не се променя.

екстернант Int strlen (конст * CHAR); // на

екстернант знак * strcpy (знак * да, конст * CHAR от);

екстернант Int strcmp (конст * CHAR, конст * CHAR);

Значението на тази практика увеличава размера на програмата.

Имайте предвид, че параметър преминаване семантика са различни от семантиката на задача. Важно е на константи параметри, референтни параметри и параметри на някои потребителски дефинирани типове.

От функция, която не е описана като недействителни, може (и трябва) връщане стойност. Върнатата стойност се определя от отчета за връщане.

Функцията може да бъде повече от един оператор, за да се върне:

Като параметър преминаване семантиката, семантиката на стойности функция връщане е идентичен с семантиката на инициализация. Върнатата стойност се разглежда като променлива тип инициализатор замяна. Типът на връщане на изразяване се проверява за съответствие с типа на връщане и изпълнени всички стандартни и някои видове конвертиране на потребителя.

върне 1; // имплицитно превръща удвои (1)

връщане &local; // не правете

Тази грешка е по-рядко срещан от еквивалентния грешка при използване на препратки:

върнете местно; // taknedelayte

За щастие, за тези стойности за връщане пречи на компилатора.

Ето още един пример:

инт е () // не правете

Ако функциите на вектор параметър се използва, след това указател към първия елемент.

Int strlen (конст * CHAR);

овъгляване об [] = «вектор»

С други думи, предаването като параметър от тип Т [] се превръща T *. Следователно елемент задача променя стойността на елемент вектор параметър вектор, който е параметър. С други думи, векторът е различен от всички други типове в която не се изпращат вектора (или предавани) от стойността.

размер вектор не е налична функцията обаждане. То може да бъде неприятно, но тази трудност може да бъде заобиколена от няколко метода. Line завършваща с нула, така че размерът му може лесно да бъде изчислено. За други вектори може да предава втори параметър, който определя размера, или да се определи вида, съдържащ показалеца и индикатор на дължина, и го предава вместо просто вектор.

нищожен compute1 (инт * vec_ptr, вътр vec_size); // odinsposob

структура на ВЕЦ

невалидни compute2 (VEC обем);

С многомерни масиви всички по-сложни, но често може да се използва вместо вектор на насоки, които не се нуждаят от специално внимание.

«Пон», «вт», «омъжи», «чт», «пт», «седна», «слънце»

От друга страна, ние смятаме, дефиницията на функция, която работи с двуизмерни решетки. Ако измерение е известно, по време на компилация, тогава няма проблем:

невалидни print_m34 (междинно m [3] [4])







за (INT I = 0; и<3; i++)

за (Int J = 0; J<4; j++)

Cout <<" " <

Cout <<"\n";

Matrix, разбира се, той все още се предава като указател, а размерите са използвани само за Обозначения удобство.

Първото измерение на масива не е свързан с проблема за намиране на позицията на елемента. Поради това може да се предава като параметър:

невалидни print_mi4 (междинно m [] [4], Int dim1)

настройки по подразбиране

Често в най-общия случай, функцията изисква повече параметри, отколкото в най-простия случай, и по-често използвани. Например, в поток библиотека е функция хекс (), генериране на низ с шестнадесетично представяне на цялото. Вторият параметър се използва за определяне на броя на знаците, за да представляват първия параметър. Ако броят на героите е твърде малък, за да представляват като цяло е съкратен, ако е прекалено голям, низа е подплатени с интервали. Често програмист не се интересува от броя на знаците, необходими за представяне на цялата система, тъй героите достатъчни. Ето защо, до нула във втория параметър е решен да "използват колкото се може повече знаци, колкото е необходимо." За да се избегне запушване на предизвикателствата на програмата, като шестнадесетичен (аз, 0), функцията се опише по следния начин:

екстернант знак * хекс (дълго, Int = 0);

Инициализиране втори параметър е настройката по подразбиране. Това е, ако обаждането е дадена само една опция като втори параметър се използва по подразбиране.

Cout <<"**" <

Cout <<"**" <

Настройката по подразбиране е отметнато тип във функция и се изчислява по време на повикване нея. Настройката по подразбиране е възможно само да попитам за най-новите параметри, така че

Int е (междинно съединение, Int = 0, знак * = 0); // ОК

Int г (Int = 0, Int = 0, знак *); // грешка

Int е (Int = 0, Int, знак * = 0); // грешка

Забележете, че в този контекст пространството между и * = значителен (* = е оператор задача):

Int груба (знак * = 0); // синтактична грешка

име претоварване функция

Като общо правило, за да даде различни функции различни имена - идеята е добра, но когато някои от функциите вършат същата работа с обекти от различен тип може да бъде по-удобно, за да им даде едно и също име. Използването на едно име за различни действия от различни видове се нарича претоварване (претоварване). Методът вече се използва за C ++ основни операции: в допълнение, има само едно име, + но тя може да се използва за добавяне на стойностите на типа неразделна, плаващи и показалеца. Тази идея е лесно да се удължи с операциите по обработка, определени от потребителя, т.е. функции. За да се защити от програмиста случайно повторно използване на името, името може да се използва за повече от една функция, само ако е описан за първи път е претоварена.

По отношение на компилатора, единственото нещо общо помежду си, те имат функция със същото име, е името. Предполага се, че те са в известен смисъл подобен, но на езика, нито ограничи програмист или да му помогне. По този начин, претоварени имена на функции - това е най-вече удобство влизане. Това е много по-удобно в случай на функции с общи имена като SQRT, печат и отворен. Когато името е семантично значение, какъвто е случаят за операции като +, * и <<и в случае конструкторов, это удобство становится существенным.

Когато се обадите претоварен е (), компилаторът трябва да се разбере кои от функциите име е трябва да се прилага. Това се прави чрез сравняване на видовете действителните параметри с типовете на формалните параметри на функция на име е. Търсене функции, които трябва да се свържете, извършени в три отделни стъпки:

Търсене функции съответства точно да го използвате и ако се установи;

Търсене на подходящата функция с помощта на вградения в превръщането и използвате всяка намерена функция; и

Търсене на подходящата функция с помощта на превръщането дефинирани от потребителя, и ако наборът от трансформации е уникална, използвайте функцията намерен.

претоварване печат (двойно), печат (инт);

Член точно съвпадение гарантира, че отпечатъците F 1 като цяло и 1.0 като число с плаваща точка. Нула, знак или кратко вътр параметър точно съвпадение. По същия начин, флоатно отговаря точно двойно.

Параметрите на функции, които водят натоварен имена на стандартната C ++ правила за преобразуване не се прилагат напълно. Преобразуване, която може да унищожи данни, не са изпълнени. Int останат дълго, Int в двойна, нулева дълго и нула в указателите двойни превръщане: указател към нула, нула невалидни * и указател към получени класа указател към базовия клас.

Ето един пример, в който се налага превръщане:

претоварване печат (двойно), печат (дълга);

Възможно е да има отпечатан или двойна, или колко дълго. Неяснотата е решен изрично вид реализация (или печат (дълга (а)), или печат (двойно (а))).

Съгласно тези правила може да се гарантира, че когато ефективността и точността на изчисленията за видовете, използвани са значително по-различни, алгоритъмът ще използва най-простият (функция).

двойно диаграма (двойно, двойно); // на

комплекс диаграма (двойна, комплекс); // на

комплекс диаграма (комплекс, Int);

комплекс диаграма (комплекс, двойно);

комплекс диаграма (комплекс, комплекс);

Protsesspoiskapodhodyascheyfunktsiiignoriruet неподписан и Конст.

Неопределен брой параметри

За някои функции не могат да се уточни броя и вида на всички параметри, които могат да се очакват в поканата. Тази функция се описва попълване на списък с описание на параметрите на елипса (.), Което означава "и може би някои други опции."

Това се посочва, че поканата трябва да се ФОРМАТ поне един параметър, знак *, а другият може или не може да бъде.

ФОРМАТ ( «Moeimya% S% S \ н», first_name, second_name);

ФОРМАТ ( ".. + = \ н.", 2,3,5);

Тази функция се основава на информация, която не е достъпна за компилатора, когато се интерпретират своя списък параметър. В случай на ФОРМАТ () в първия параметър е низ формат, който съдържа специални последователности от символи, които позволяват ФОРМАТ (), за да се справят правилно останалите параметри. % S означава "чакам параметър Чар *», както добре. означава "чакам параметър Int." Въпреки това, компилаторът не знае, така че той не може да бъде сигурен, че очакваните параметри имат подходящ вид.

ФОРМАТ ( «Моето име% S% S \ н», 2);

Събиране и в най-добрия ще доведе до някакъв странен вид проблем.

Очевидно е, че ако този параметър не е описан, то компилаторът не е необходимо да бъдат извършени върху тях тип изпитване и вид реализация информация. В този случай, знак или предава, като кратко вътр, флоат и предава като двойна. Това не е непременно това, което се очаква потребителят.

Прекомерната употреба на точки, като дивата природа (.), Напълно забранява видове параметри валидиране, оставяйки програмист отворен до множество проблеми, които са познати на програмисти в C. В добре проектирана програма изисква най-много няколко функции, за които не са напълно определени видове настройки. За да се грижи за видовете проверки, можете да използвате претоварени функции и функции с настройките по подразбиране в повечето случаи, когато в противен случай ще трябва да напусне неискан видове параметри. Многоточие е необходимо само ако промените брой параметри и параметри на типа. Най-честата употреба на точките в интерфейса на задача за библиотечните функции C, които са били идентифицирани по време, когато нямаше алтернатива:

екстернант Int fprintf (FILE *, знак *.); // на

екстернант Int execl (знак *.); // на

екстернант Int прекъсване (.); // на

Да разгледаме случая на писане функцията на грешката, която има една число параметър показва тежестта на грешката, което е последвано от произволен брой редове. Идеята е да се направи съобщение за грешка чрез предаването на всяка дума като отделен параметър низ:

Основната (междинно argc, знак * argv [])