01
од 09
Покретање Ц ++ класе
Објекти су највећа разлика између Ц ++ и Ц. Једно од најранијих имена за Ц ++ било је Ц са класама.
Класе и предмети
Класа је дефиниција објекта. То је такав тип инт. Класа личи на а струцт са само једном разликом: сви чланови структуре су подразумевано јавни. Сви чланови класе су приватни.
Запамтите - класа је тип, а предмет ове класе само је променљива.
Пре него што можемо да користимо предмет, он се мора креирати. Најједноставнија дефиниција класе је:
Назив класе {
// мемберс
}
Овај пример класе испод моделира једноставну књигу. Коришћење ООП-а омогућава вам апстрахирање проблема и размишљање о њему, а не само о произвољним варијаблама.
// пример један
#инцлуде
#инцлуде
класа Боок
{
инт ПагеЦоунт;
инт ЦуррентПаге;
јавно:
Књига (инт Нумпагес); // Цонструцтор
~ Боок () {}; // Деструцтор
воид СетПаге (инт ПагеНумбер);
инт ГетЦуррентПаге (воид);
};
Књига:: Књига (инт НумПагес) {
ПагеЦоунт = НумПагес;
}
воид Боок:: СетПаге (инт ПагеНумбер) {
ЦуррентПаге = Број странице;
}
инт Боок:: ГетЦуррентПаге (воид) {
вратити ЦуррентПаге;
}
инт маин () {
Књига АБоок (128);
Књига. СетПаге (56);
стд:: цоут << "Тренутна страница" << АБоок. ГетЦуррентПаге () << стд:: ендл;
ретурн 0;
}
Сав код из разредна књига доле до инт Боок:: ГетЦуррентПаге (воид) { функција је део класе. Тхе главни() функција је ту да направи ову апликацију за покретање.
02
од 09
Разумевање класе књига
У главни() функционира варијабла АБоок типа Боок креирана је са вриједношћу 128. Чим извршење достигне ову тачку, објект АБоок се конструише. У следећем реду метода Књига. СетПаге () позива се и вриједност 56 додјељује објектној варијабли Књига. Тренутна страна. Онда цоут производи ову вредност позивањем Књига. ГетЦуррентПаге () метод.
Када извршење достигне ретурн 0; АБОок објект више није потребан апликацији. Компајлер генерише позив деструктору.
Изјава класе
Све између Боок оф Цласс и тхе } је декларација класе. Ова класа има два приватна члана, оба типа инт. Они су приватни јер је подразумевани приступ члановима класе приватан.
Тхе јавно: директива каже преводилац да је приступ одавде јавни. Без тога, она би и даље била приватна и спречавала приступ три реда у главној () функцији да приступе члановима Абоок-а. Покушајте да коментаришете јавно: издвојите и поново компајлирајте да бисте видели настале грешке у састављању.
Овај ред испод објављује Конструктора. Ово је функција која се зове када се предмет први пут креира.
Књига (инт Нумпагес); // Цонструцтор
Зове се са линије
Књига АБоок (128);
Ово ствара објект који се зове АБоок типа Боок и позива функцију Боок () са параметар 128.
03
од 09
Више о класи књиге
У Ц ++, конструктор увек има исти назив као и класа. Конструктор се позива када се објект креира и тамо где требате ставити свој код да бисте га иницијализирали.
У књизи Следећи ред након конструктора деструктор. Ово има исти назив као конструктор, али са ~ (тилдом) испред њега. За време уништавања објекта, деструктор се позива да среди објект и осигура да се ослободе ресурси попут меморије и руковања датотекама које објект користи.
Запамтити- класа киз има функцију конструктора киз () и функцију деструктора ~ киз (). Чак и ако се не изјасните, преводилац ће их тихо додати.
Деструктор се увек позива када се објекат укине. У овом примјеру објект се имплицитно уништава кад изађе из оквира. Да бисте ово видели, модификујте декларацију деструктора на ово:
~ Боок () {стд:: цоут << "Деструктор позван";}; // Деструцтор
Ово је инлине функција са кодом у декларацији. Други начин за инлине је додавање речи инлине
инлине ~ Књига (); // Деструцтор
и додајте деструктор као функцију попут ове.
инлине књига:: ~ Књига (празнина) {
стд:: цоут << "Деструктор позван";
}
Инлине функције су савјети компајлеру да би створио ефикаснији код. Треба их користити само за мале функције, али ако се користе на одговарајућим местима - као што су унутра петље—Могу значајне разлике у перформансама.
04
од 09
Методе наставе писања
Најбоља пракса за објекте је све податке учинити приватним и приступити им кроз функције познате као функције приступа. СетПаге () и ГетЦуррентПаге () су две функције које се користе за приступ објектној варијабли Тренутна страна.
Промијенити класа декларација за структурирање и прекомпоновање. И даље треба да се компајлише и изврши правилно. Сада две променљиве ПагеЦоунт и Тренутна страна су јавно доступни. Додајте ову линију након књиге АБоок (128), и она ће се саставити.
Књига. ПагеЦоунт = 9;
Ако промените структуру назад у класа и прекомпоновати, та нова линија се више неће компилирати као ПагеЦоунт сада је поново приватна.
Тхе:: Нотатион
Након тела декларације о класи књиге, постоје четири дефиниције функција чланова. Сваки је дефиниран префиксом Боок:: да би га идентификовао као припадник тој класи.:: зове се идентификатор обухвата. Идентифицира функцију као дио класе. То је очигледно у декларацији класе, али не и ван ње.
Ако сте функцију члана прогласили у класи, на тај начин морате обезбедити тело функције. Ако сте желели да класа Боок буде употребљена у другим датотекама, тада бисте декларацију књиге могли преместити у засебну хеадер датотека, која се можда зове боок.х. Било која друга датотека тада би га могла укључити
#инцлуде "боок.х"
05
од 09
Наслеђивање и полиморфизам
Овај пример ће демонстрирати наследство. Ово је апликација за две класе са једном класом изведеном из друге.
#инцлуде
#инцлуде
класа Поинт
{
инт к, и;
јавно:
Тачка (инт атк, инт ати); // Цонструцтор
инлине виртуал ~ ~ Поинт (); // Деструцтор
виртуал воид Драв ();
};
Круг класе: јавни пунк {
инт радијус;
јавно:
Круг (инт атк, инт ати, инт тхеРадиус);
инлине виртуал ~ ~ Цирцле ();
виртуал воид Драв ();
};
Тачка:: Поинт (инт атк, инт ати) {
к = атк;
и = ати;
}
инлине Поинт:: ~ Тачка (празнина) {
стд:: цоут << "Деструктор тачке позван";
}
воид Поинт:: Цртање (воид) {
стд:: цоут << "Тачка:: Цртајте тачку на" << к << "" << и << стд:: ендл;
}
Цирцле:: Цирцле (инт атк, инт ати, инт тхеРадиус): Тачка (атк, ати) {
радијус = тхеРадиус;
}
редни круг:: ~ Цирцле () {
стд:: цоут << "Деструктор круга назван" << стд:: ендл;
}
воид Цирцле:: Цртање (воид) {
Тачка:: Цртање ();
стд:: цоут << "круг": Драв поинт "<}инт маин () {Цирцле Цирцле (10,10,5);Круг. Драв ();ретурн 0;}
Пример има две класе, Тачку и Круг, који моделирају тачку и круг. Тачка има к и и координате. Класа Цирцле је изведена из класе Поинт и додаје радијус. Обе наставе укључују: Драв () функција члана. Да би овај пример био кратак, излаз је само текст.
06
од 09
Наслеђивање
Класа Круг је изведено из Тачка класа. Ово се ради у овом ретку:
Круг класе: Тачка {
Пошто је изведен из основне класе (Поинт), Цирцле наслеђује све чланове класе.
Тачка (инт атк, инт ати); // Цонструцтор
инлине виртуал ~ ~ Поинт (); // Деструцтор
виртуал воид Драв ();
Круг (инт атк, инт ати, инт тхеРадиус);
инлине виртуал ~ ~ Цирцле ();
виртуал воид Драв ();
Замислите класу Цирцле као класу Поинт са додатним чланом (радијусом). Насљеђује функције члана основне базе и приватне варијабле Икс и и.
Не може их доделити или користити, осим имплицитно, јер су приватни, па то мора учинити кроз листу иницијатора покретача Цирцле. Ово је нешто што би требало да прихватите као и до сада. Вратићу се листама иницијализатора у будућем уџбенику.
Прије у Конструктору круга тхеРадиус је додељено радијус, Поинт точка круга се конструише позивом Поинт конструктора на листи иницијализатора. На овој листи је све између: и {испод.
Цирцле:: Цирцле (инт атк, инт ати, инт тхеРадиус): тачка (атк, ати)
Иначе, иницијализација типа конструктора може се користити за све уграђене типове.
инт а1 (10);
инт а2 = 10;
Обоје чине исто.
07
од 09
Шта је полиморфизам?
Полиморфизам је генерички термин који значи "много облика". У Ц ++ најједноставнији облик полиморфизма је преоптерећење функција. На пример, позвано је неколико функција СортАрраи (низ поља) где би сортар могао бити низ интс или парови.
Овде нас занима само ООП облик полиморфизма. То се врши тако што ћете направити функцију (нпр. Цртати ()) виртуална у основној класи Поинт, а затим га надјачавају у изведена класа Круг.
Иако је функција Драв () је виртуална у изведеној класи Круг, ово заправо није потребно - само ме подсећа да је то виртуално. Ако се функција у изведеној класи подудара с виртуалном функцијом у основној класи у називима и врстама параметара, аутоматски је виртуална.
Цртање тачке и цртање круга две су врло различите операције са само заједничким координатама тачке и круга, тако да је важно да тачна Драв () се зове. Како компајлер успева да генерише код који добија праву виртуелну функцију биће покривен у будућем водичу.
08
од 09
Ц ++ Конструктори
Конструктори
Конструктор је функција која иницијализира чланове објекта. Конструктор зна само како да изгради објект сопствене класе.
Конструктори се аутоматски не наслеђују између основних и изведених класа. Ако га не испоручите у изведеној класи, биће обезбеђена задана поставка, али то можда неће радити оно што желите.
Ако није испоручен ниједан конструктор, онда компајлер креира задани облик без икаквих параметара. Увек мора постојати конструктор, чак и ако је задани и празан. Ако добављате конструктору параметре, задана поставка НИЈЕ створена.
Неке тачке о конструкторима:
- Конструктори су само функције са истим називом као и класа.
- Конструктори имају за циљ иницијализирање чланова класе када се створи инстанца те класе.
- Конструктори се не позивају директно (осим кроз листе иницијализатора)
- Конструктори никада нису виртуелни.
- Може се дефинисати више конструктора за исту класу. Морају имати различите параметре да би их разликовали.
Има пуно више за научити о конструкторима, на пример, подразумеваним конструкторима, конструкторима додељивања и копирања. О њима ће се разговарати у следећој лекцији.
09
од 09
Уклањање деструктора Ц ++
Деструктор је функција члана класе која има исти назив као конструктор (и класа), али са ~ (тилде) испред.
~ Цирцле ();
Када неки предмет изађе из обима или се ређе уништи, позива се његов деструктор. На примјер, ако објект има динамичке варијабле, попут показивача, тада их је потребно ослободити, а деструктор је одговарајуће мјесто.
За разлику од конструктора, деструктори могу и треба да буду виртуелни ако имате изведене класе. У Тачка и Круг Примјер класе, деструктор није потребан јер не треба радити чишћење (он служи само као примјер). Да су постојале динамичке променљиве члана (попут показивачи) тада би њима било потребно ослобађање да се спрече цурења меморије.
Такође, када изведена класа додаје чланове који захтевају уређивање, потребни су и виртуелни деструктори. Када је виртуелни, најпре се позива деструктор класе, а затим се назива деструктор његовог непосредног претка, и тако даље, до основне класе.
У нашем примеру,
~ Цирцле ();
онда
~ Тачка ();
Деструктор основне класе назива се последњим.
Овим се завршава ова лекција. У следећој лекцији научите о подразумеваним конструкторима, конструкторима копирања и задатку.