Ц ++

Како се користе Ц ++ предлошци

Како се користе Ц ++ предлошци

Увод

У основном програмирању на Ц ++, тип података, нпр.г., инт или цхар, мора бити назначено у декларацији или дефиницији. Вредност као што је 4 или 22 или -5 је инт. Вредност као што је „А“ или „б“ или „ц“ је знак. Механизам предлошка омогућава програмеру да користи генерички тип за скуп стварних типова. На пример, програмер може одлучити да користи идентификатор Т за инт или цхар. Могуће је да алгоритам Ц ++ има више од једног генеричког типа. Са, рецимо, Т за инт или цхар, У може значити тип флоат или показивача. Класа, попут низа или векторске класе, слична је типу података, а инстанцирани објекти су попут вредности типа података, а то је наведена класа. Дакле, механизам предлошка такође омогућава програмеру да користи генерички идентификатор типа за скуп класа.

Предложак Ц ++ креира алгоритам неовисан од врсте података који се користе. Дакле, исти алгоритам, са много појављивања истог типа, може да користи различите типове при различитим извршењима. Ентитети променљиве, функције, структуре и класе могу имати предлошке. Овај чланак објашњава како се пријављују предлошци, како се дефинишу предлошци и како се примењују у језику Ц++. Већ бисте требали имати знање о горе поменутим ентитетима да бисте разумели теме обухваћене овим чланком.

Врсте

Скалар

Скаларни типови су воид, боол, цхар, инт, флоат и показивач.

Класе као врсте

Одређена класа се може сматрати врстом, а њени објекти могућим вредностима.

Генерички тип представља скуп скаларних типова. Листа скаларних типова је опсежна. Тип инт, на пример, има и друге сродне типове, попут кратког инт, лонг инт итд. Генерички тип такође може представљати скуп класа.

Променљива

Пример декларације шаблона и дефиниције је следећи:

шаблон
Т пи = 3.14;

Пре него што наставите, имајте на уму да се ова врста изјаве не може појавити у главној () функцији или било ком опсегу блока. Први ред је декларација главе предлошка, са генеричким именом типа Т, које је изабрао програмер. Следећи ред је дефиниција идентификатора, пи, који је генеричког типа, Т. Прецизност, да ли је Т инт или флоат или неки други тип, може се извршити у функцији Ц ++ маин () (или некој другој функцији). Таква прецизност ће се вршити са променљивом пи, а не са Т.

Први ред је декларација главе предлошка. Ова декларација започиње резервисаном речју, шаблоном, а затим отвореним и затвореним угластим заградама. Унутар угластих заграда налази се најмање један идентификатор генеричког типа, као што је Т, горе. Може бити више генеричких идентификатора типа, а сваком претходи резервисана реч, типенаме. Такви генерички типови на том положају називају се параметри предлошка.

Следећа изјава може бити написана у маин () или у било којој другој функцији:

цоут << pi << '\n';

А функција би приказала 3.14. Израз пи одлучује тачан тип Т за променљиву пи. Специјализација одлучује о одређеном типу података за параметар предлошка. Инстантирање је у овом случају интерни процес стварања одређеног типа, као што је флоат, на Ц ++. Не бркајте између инстанцирања параметра предлошка и инстанцирања класе. У теми предлошка, многи типови података могу имати једно генеричко име типа, док многи разреди могу имати једно генеричко име класе. Међутим, генеричко име класе за класе једноставно се назива класа, а не као име класе. Такође, вредност је за тип података, као што је инт, као инстанцирани објекат за класу, попут класе Стринг.

На специјализацији, изабрани тип података, као што је флоат, ставља се у углате заграде након променљиве. Ако постоји више од једног параметра предлошка у декларацији главе предлошка, у изразу специјализације биће одговарајући број типова података истим редоследом.

На специјализацији, тип је познат као аргумент предлошка. Не мешајте ово са аргументом функције за позив функције.

Подразумевани тип

Ако се на специјализацији не даје тип, подразумева се подразумевани тип. Дакле, из следећег израза:

шаблон
У пи = "љубав";
дисплеј са:
цоут << pi<> << '\n';

је „љубав“ према сталном показивачу на цхар. Примети у декларацији да је У = цонст цхар *. Угаоне заграде ће бити празне на специјализацији (није наведена врста); стварни тип се сматра цонст показивачем на цхар, задати тип. Ако би на специјализацији био потребан неки други тип, тада би се назив типа написао у угластим заградама. Када се подразумевани тип жели на специјализацији, понављање типа у угластим заградама није обавезно, тј.е., угаоне заграде могу остати празне.

Напомена: задати тип се и даље може променити на специјализацији тако што ћете имати други тип.

струцт

Следећи пример показује како се параметар предлошка може користити са структуром:

шаблон струцт Агес

Т Јован = 11;
Т Петар = 12;
Т Марија = 13;
Т Радост = 14;
;

Ово су узрасти ученика у неком разреду (одељењу). Први ред је декларација шаблона. Тело у заградама је стварна дефиниција шаблона. Старосне доби се могу приказати у функцији маин () на следећи начин:

Доба граде7;
цоут << grade7.John << " << grade7.Mary << '\n';

Излаз је: 11 13. Прва изјава овде врши специјализацију. Обратите пажњу на то како је направљен. Такође даје назив за објект структуре: граде7. Друга изјава има уобичајене изразе објектних структура. Структура је попут класе. Овде је Агес попут имена класе, док је граде7 објекат класе (струцт).

Ако су неки узрасти цели бројеви, а други флоати, тада структури требају два генеричка параметра, како следи:

шаблон струцт Агес

Т Јован = 11;
У Петру = 12.3;
Т Марија = 13;
У Радост = 14.6;
;

Релевантни код за функцију маин () је следећи:

Доба граде7;
цоут << grade7.John << " << grade7.Peter << '\n';

Излаз је: 11 12.3. При специјализацији, редослед типова (аргумената) мора одговарати редоследу генеричких типова у декларацији.

Декларација шаблона може се одвојити од дефиниције, како следи:

шаблон струцт Агес

Т Јохн;
У Петер;
Т Мари;
У Јои;
;
Доба оцена7 = 11, 12.3, 13, 14.6;

Први сегмент кода је чисто декларација шаблона (нема задатака). Други сегмент кода, који је само изјава, је дефиниција идентификатора, граде7. На левој страни је декларација идентификатора, оцена 7. Десна страна је листа иницијализатора, која додељује одговарајуће вредности члановима структуре. Други сегмент (исказ) може се записати у функцији маин (), док први сегмент остаје изван функције маин ().

Нетипски

Примери типова података који нису подаци укључују типове инт, показивач на објекат, показивач на функцију и аутоматске типове. Постоје и друге врсте које се не односе на овај чланак. Нетип је попут непотпуног типа чија се вредност даје касније и не може се променити. Као параметар, започиње одређеним нетипом, а иза њега следи идентификатор. Вредност идентификатора даје се касније, на специјализацији, и не може се поново променити (попут константе, чија је вредност дата касније). Следећи програм то илуструје:

#инцлуде
коришћење простора имена стд;
шаблон струцт Агес

Т Јован = Н;
У Петру = 12.3;
Т Марија = Н;
У Радост = 14.6;
;
инт маин ()

Доба граде7;
цоут << grade7.John << " << grade7.Joy << '\n';
ретурн 0;

На специјализацији, први тип, инт, у углатим заградама постоји више због формалности, како би се осигурало да број и редослед параметара одговарају броју и редоследу типова (аргумената). Вредност Н дата је на специјализацији. Излаз је: 11 14.6.

Делимична специјализација

Претпоставимо да предложак има четири генеричка типа и да, између четири типа, постоје потребе за два подразумевана типа. То се може постићи помоћу конструкције делимичне специјализације која не запошљава оператора доделе. Дакле, конструкција делимичне специјализације даје подразумеване вредности подскупу генеричких типова. Међутим, у шеми делимичне специјализације потребне су основна класа (струцт) и делимична класа специјализације (струцт). Следећи програм то илуструје за један генерички тип од два генеричка типа:

#инцлуде
коришћење простора имена стд;
// основна класа предлошка
шаблон
струцт Агес

;
// делимична специјализација
шаблон
струцт Агес

Т1 Јован = 11;
пловак Петар = 12.3;
Т1 Марија = 13;
плутајућа Радост = 14.6;
;
инт маин ()

Доба граде7;
цоут << grade7.John << " << grade7.Joy << '\n';
ретурн 0;

Идентификујте декларацију основне класе и њену делимичну дефиницију класе. Декларација главе предлошка основне класе има све неопходне генеричке параметре. Декларација главе предлошка класе делимичне специјализације има само генерички тип. У схеми се користи додатни скуп угластих заграда које долазе непосредно након назива класе у дефиницији делимичне специјализације. То је оно што заправо чини делимичну специјализацију. Има подразумевани тип и тип који није подразумеван, редоследом написаним у основној класи. Имајте на уму да се подразумеваном типу и даље може доделити други тип у функцији маин ().

Релевантни код у функцији маин () може бити следећи:

Доба граде7;
цоут << grade7.John << " << grade7.Joy << '\n';

Излаз је: 11 14.6.

Пакет параметара предлошка

Пакет параметара је параметар предлошка који прихвата нула или више генеричких типова предложака за одговарајуће типове података. Параметар пакета параметара започиње резервираним именом типа или класе речи. Након тога следе три тачке, а затим идентификатор за паковање. Следећи програм илуструје како се пакет параметара предлошка може користити са структуром:

#инцлуде
коришћење простора имена стд;
шаблон струцт Агес

инт Јован = 11;
пловак Петар = 12.3;
инт Марија = 13;
плутајућа Радост = 14.6;
;
инт маин ()

Доба градеБ;
цоут << gradeB.John << " << gradeB.Mary << '\n';
Доба градеЦ;
цоут << gradeC.Peter << " << gradeC.Joy << '\n';
Доба градеД;
цоут << gradeD.John << " << gradeD.Joy << '\n';
Доб <> оцена А; // као подразумевано
цоут << gradeA.John << " << gradeA.Joy << '\n';
ретурн 0;

Излаз је:

11 13
12.3 14.6
11 14.6
11 14.6

Предлошци функција

Горе наведене функције шаблона примењују се на сличан начин на шаблоне функција. Следећи програм приказује функцију са два општа параметра предлошка и три аргумента:

#инцлуде
коришћење простора имена стд;
шаблон воид фунц (Т не, У цха, цонст цхар * стр)

цоут << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

инт маин ()

фунц (12, '$', "500");
ретурн 0;

Излаз је следећи:

У продавници постоји 12 књига вредних 500 долара.

Одвајање од прототипа

Дефиниција функције може се одвојити од њеног прототипа, као што показује следећи програм:

#инцлуде
коришћење простора имена стд;
шаблон воид фунц (Т не, У цха, цонст цхар * стр);
шаблон воид фунц (Т не, У цха, цонст цхар * стр)

цоут << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

инт маин ()

фунц (12, '$', "500");
ретурн 0;

Напомена: Декларација шаблона функције не може се појавити у главној () функцији или било којој другој функцији.

Преоптерећење

Преоптерећење исте функције може се догодити различитим декларацијама главе предлошка. Следећи програм то илуструје:

#инцлуде
коришћење простора имена стд;
шаблон воид фунц (Т не, У цха, цонст цхар * стр)

цоут << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

шаблон воид фунц (Т не, цонст цхар * стр)

цоут << "There are " << no << " books worth $" << str << " in the store." << '\n';

инт маин ()

фунц (12, '$', "500");
фунц (12, "500");
ретурн 0;

Излаз је:

У продавници постоји 12 књига вредних 500 долара.

У продавници постоји 12 књига вредних 500 долара.

Предлошци предавања

Карактеристике горе поменутих шаблона примењују се на сличан начин као и предлошци класа. Следећи програм је декларација, дефиниција и употреба једноставне класе:

#инцлуде
коришћење простора имена стд;
класа ТхеЦла

јавно:
инт нум;
статички знак;
воид фунц (цхар цха, цонст цхар * стр)

цоут << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

статична воид забава (цхар цх)

ако (цх == 'а')
цоут << "Official static member function" << '\n';

;
инт маин ()

ТхеЦла обј;
обј.нум = 12;
обј.фунц ('$', "500");
ретурн 0;

Излаз је следећи:

У продавници постоји 12 књига вредних 500 долара.

Следећи програм је горњи програм са декларацијом главе предлошка:

#инцлуде
коришћење простора имена стд;
шаблон класа ТхеЦла

јавно:
Т нум;
статички У цх;
воид фунц (У цха, цонст цхар * стр)

цоут << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

забава у статичкој празнини (У цх)

ако (цх == 'а')
цоут << "Official static member function" << '\n';

;
инт маин ()

ТхеЦла обј;
обј.нум = 12;
обј.фунц ('$', "500");
ретурн 0;

Уместо имена типа речи на листи параметара предлошка, може се користити класа речи. Обратите пажњу на специјализацију у декларацији објекта. Излаз је и даље исти:

У продавници постоји 12 књига вредних 500 долара.

Издвајање декларације

Декларација предлошка класе може се одвојити од кода класе, како следи:

шаблон класа ТхеЦла;
шаблон класа ТхеЦла

јавно:
Т нум;
статички У цх;
воид фунц (У цха, цонст цхар * стр)

цоут << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

забава у статичкој празнини (У цх)

ако (цх == 'а')
цоут << "Official static member function" << '\n';

;

Суочавање са статичким члановима

Следећи програм показује како приступити статичном члану података и функцији статичког члана:

#инцлуде
коришћење простора имена стд;
шаблон класа ТхеЦла

јавно:
Т нум;
статички У цх;
воид фунц (У цха, цонст цхар * стр)

цоут << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

забава у статичкој празнини (У цха)

ако (цх == 'а')
цоут << "Official static member function" << cha << '\n';

;
шаблон У ТхеЦла:: цх = 'а';
инт маин ()

ТхеЦла::забавно('.');
ретурн 0;

Додељивање вредности статичном члану података је декларација и не може бити у маин (). Обратите пажњу на употребу и положаје генеричких типова и генеричких типова података у изразу додељивања. Поред тога, имајте на уму да је функција статичког члана података позвана у маин (), са стварним типовима података предлошка. Резултат је следећи:

Званична функција статичког члана.

Састављање

Декларација (заглавље) и дефиниција шаблона морају бити у једној датотеци. Односно, морају бити у истој преводилачкој јединици.

Закључак

Ц ++ предлошци чине алгоритам неовисним од врсте података који се користе. Ентитети променљиве, функције, структуре и класе могу имати предлошке, који укључују декларацију и дефиницију. Израда шаблона такође укључује специјализацију, а то је када генерички тип узима стварни тип. Декларација и дефиниција шаблона морају бити у једној преводној јединици.

Водич за битку за Веснотх
Битка за Веснотх је једна од најпопуларнијих стратешких игара отвореног кода које тренутно можете играти. Не само да је ова игра у развоју већ јако ду...
0 А.Д. Приручник
Од многих стратешких игара тамо, 0 А.Д. успева да се истакне као свеобухватан наслов и врло дубока, тактичка игра упркос томе што је отворен извор. Ра...
Водич за Унити3Д
Увод у Унити 3Д Унити 3Д је моћан мотор за развој игара. То је унакрсна платформа која вам омогућава да креирате игре за мобилне уређаје, веб, стоне р...