Въведение в C ++ класове и обекти

01

от 09

Започва C ++ класове

Ръцете пишете на лаптоп
Сам Едуардс / Гети Имидж

обекти са най-голямата разлика между C ++ и C. Едно от най-ранните имена за C ++ беше C с класове.

Класове и предмети

Класът е дефиниция на обект. Тип е точно като инт. Класът наподобява a структура само с една разлика: всички членове на структурата са публични по подразбиране. Всички членове на класовете са частни.

Запомнете - клас е тип, а обект от този клас е просто a променлив.

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

 име на клас {

 // членове

 }


Този примерен клас по-долу моделира обикновена книга. Използването на OOP ви позволява да абстрахирате проблема и да мислите за него, а не само за произволни променливи.

 // пример един

 #include 

 #include 


 клас Книга

 {

 int PageCount;

 int CurrentPage; 

 публичния:

 Книга (int Numpages); // Конструктор

 ~ Book () {}; // Разрушител

 void SetPage (int PageNumber);

 int GetCurrentPage (void);

 }; 


 Книга:: Книга (int NumPages) {

 PageCount = NumPages;
instagram viewer

 }


 void Book:: SetPage (int PageNumber) {

 CurrentPage = PAGENUMBER;

 }


 int Book:: GetCurrentPage (void) {

 връщане CurrentPage;

 }


 int main () {

 Книга ABook (128);

 Книга. SetPage (56);

 std:: cout << "Текуща страница" << ABook. GetCurrentPage () << std:: endl;

 връщане 0;

 }


Целият код от класната книга надолу към int Book:: GetCurrentPage (void) { функция е част от класа. Най- Основната () функция е там, за да направи това приложение за изпълнение.

02

от 09

Разбиране на класа на книгата

В Основната () функционира променлива ABook от тип Book се създава със стойността 128. Щом изпълнението достигне до тази точка, обектът ABook е конструиран. На следващия ред методът Книга. SetPage () се извиква и стойността 56 се присвоява на обектната променлива Книга. Текуща страница. Тогава Cout извежда тази стойност чрез извикване на Книга. GetCurrentPage () метод.

Когато изпълнението достигне до връщане 0; обектът ABook вече не е необходим от приложението. Компилаторът генерира повикване към деструктора.

Деклариране на класове

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

Най- публичния: директива казва на съставител че достъпът оттук нататък е публичен. Без това той все още ще бъде частен и ще попречи на трите реда във функцията main () да имат достъп до членовете на Abook. Опитайте да коментирате публичния: изравнете и прекомпилирайте, за да видите произтичащите от това компилационни грешки.

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

 Книга (int Numpages); // Конструктор 

Обажда се от линията

 Книга ABook (128); 

Това създава обект, наречен ABook от тип Book и извиква функцията Book () с параметър 128.

03

от 09

Повече за класа на книгата

В C ++ конструкторът винаги има същото име като класа. Конструкторът се извиква, когато обектът е създаден и е мястото, където трябва да поставите кода си, за да инициализирате обекта.

В книга Следващият ред след конструктора деструктора. Това има същото име като конструктора, но с ~ (тилда) пред него. По време на унищожаването на обект, деструкторът се призовава да спретне обекта и да осигури освобождаване на ресурси като памет и обработка на файлове, използвани от обекта.

Помня—Клас xyz има функция конструктор xyz () и функция destructor ~ xyz (). Дори и да не декларирате, компилаторът безмълвно ще ги добави.

Деструкторът винаги се извиква, когато обектът бъде прекратен. В този пример обектът се унищожава косвено, когато излезе извън обхвата. За да видите това, променете декларацията на деструктора на това:

 ~ Book () {std:: cout << "Деструктор се извиква";}; // Разрушител 

Това е вградена функция с код в декларацията. Друг начин за вграждане е добавянето на думата inline

 inline ~ Book (); // Разрушител


и добавете деструктора като функция като тази.

 вградена книга:: ~ Книга (невалидна) { 

 std:: cout << "Деструктор се извиква";

 }


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

04

от 09

Методи за писане на клас

Най-добри практики за обектите е да направят всички данни частни и да получат достъп до тях чрез функции, известни като функции на аксесоар. SetPage () и GetCurrentPage () са двете функции, използвани за достъп до обектната променлива Текуща страница.

Промяна на клас декларация за структуриране и прекомпилиране. Тя все още трябва да се компилира и работи правилно. Сега двете променливи PAGECOUNT и Текуща страница са обществено достъпни. Добавете този ред след Book ABook (128) и той ще се компилира.

 Книга. PageCount = 9;


Ако промените структурата обратно на клас и прекомпилирайте, че новият ред вече няма да се компилира като PAGECOUNT вече е частен.

The:: Notation

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

Ако сте декларирали функция член в клас, трябва да предоставите тялото на функцията по този начин. Ако искате класът Book да се използва от други файлове, тогава можете да преместите декларацията за книга в отделна удар с глава файл, може би наречен book.h. След това всеки друг файл може да го включва

 #include "book.h" 

05

от 09

Наследяване и полиморфизъм

Този пример ще демонстрира наследство. Това е приложение от два класа с един клас, получен от друг.

 #include 

 #include 


 клас Point

 {


 int x, y;

 публичния:

 Точка (int atx, int aty); // Конструктор

 вградена виртуална ~ точка (); // Разрушител

 виртуален празнота Draw ();

 }; 


 клас кръг: обществена точка {


 вътрешен радиус;

 публичния:

 Кръг (int atx, int aty, int theRadius);

 вграден виртуален ~ кръг ();

 виртуален празнота Draw ();

 };



 Точка:: Point (int atx, int aty) {

 x = atx;

 y = aty;

 }


 вградена точка:: ~ точка (невалидна) { 

 std:: cout << "Точката Destructor call";

 }


 void Point:: Draw (void) {

 std:: cout << "Точка:: Начертайте точка в" << x << "" << y << std:: endl;

 }



 Circle:: Circle (int atx, int aty, int theRadius): Точка (atx, aty) {

 радиус = theRadius;

 }


 вграден кръг:: ~ Circle () {

 std:: cout << "Деструктор на кръг, наречен" << std:: endl;

 }


 void кръг:: Draw (void) {

 Точка:: Начертайте ();

 std:: cout << "кръг:: Точка на рисуване" << "Радиус" << радиус << std:: endl;

 }


 int main () {

 Circle ACircle (10,10,5);

 Кръг. Рисувам() ;

 връщане 0;

 }


Примерът има два класа, точка и кръг, моделиране на точка и кръг. Точка има x и y координати. Класът Circle се извлича от класа Point и добавя радиус. И двата класа включват a Рисувам() член функция. За да се запази този пример кратък, изходът е само текст.

06

от 09

наследяване

Класа кръг се извлича от Точка клас. Това се прави в този ред:

 клас кръг: Точка {


Тъй като е извлечен от базов клас (Point), Circle наследява всички членове на класа.

 Точка (int atx, int aty); // Конструктор

 вградена виртуална ~ точка (); // Разрушител

 виртуален празнота Draw ();


 Кръг (int atx, int aty, int theRadius);

 вграден виртуален ~ кръг ();

 виртуален празнота Draw ();


Мислете за класа Circle като класа Point с допълнителен член (радиус). Той наследява функциите на базовия клас членове и частните променливи х и ш.

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

В Конструктора на кръга, преди theRadius се присвоява на радиус, Точковата част на кръга е конструирана чрез повикване към конструктора на Point в списъка на инициализатора. Този списък е всичко между: и {по-долу.

 Circle:: Circle (int atx, int aty, int theRadius): Точка (atx, aty) 


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

 int a1 (10);

 int a2 = 10;


И двете правят едно и също.

07

от 09

Какво е полиморфизъм?

Полиморфизмът е родово понятие, което означава "много форми". В C ++ най-простата форма на полиморфизъм е претоварването на функции. Например, извикани няколко функции SortArray (тип масив) където сортарът може да бъде масив на ints или двойки.

Тук обаче се интересуваме само от формата на полиморфизъм OOP. Това става, като се направи функция (например Draw ()) виртуален в базовия клас Point и след това го отменя в производен клас Circle.

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

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

08

от 09

C ++ Конструктори

конструкторите

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

Конструкторите не се наследяват автоматично между базовите и производни класове. Ако не предоставите такъв в производния клас, ще бъде предоставена по подразбиране, но това може да не прави това, което искате.

Ако не е предоставен конструктор, тогава компилаторът създава по подразбиране без никакви параметри. Винаги трябва да има конструктор, дори ако той е по подразбиране и празен. Ако снабдите конструктор с параметри, тогава по подразбиране НЕ се създава.

Някои точки за конструкторите:

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

Има много повече неща, за да научите за конструктори, например конструктори по подразбиране, конструктори за задаване и копиране. Те ще бъдат обсъдени в следващия урок.

09

от 09

Обвързване на C ++ деструктори

Деструктор е функция от член на класа, която има същото име като конструктора (и класа), но с ~ (tilde) отпред.

 ~ Кръг ();


Когато даден обект излезе извън обхвата или по-рядко е изрично унищожен, се извиква неговият разрушител. Например, ако обектът има динамични променливи като указатели, те трябва да бъдат освободени и деструкторът е подходящото място.

За разлика от конструкторите, деструкторите могат и трябва да бъдат виртуални, ако сте получили класове. В Точка и кръг пример за класове, деструкторът не е необходим, тъй като не трябва да се извършва почистване (той служи само за пример). Имаше ли динамични променливи член (например указатели) тогава тези биха изисквали освобождаване, за да се предотврати изтичане на паметта.

Също така, когато производният клас добавя членове, които изискват подреждане, са необходими виртуални разрушители. Когато е виртуален, първо се извиква деструкторът на най-извлечените класове, след това се нарича деструктор на неговия непосредствен прародител и така нататък до базовия клас.

В нашия пример,

 ~ Кръг ();

тогава

 ~ Точка ();


Деструкторът на базовите класове се нарича последен.

С това завършва този урок. В следващия урок научете за конструкторите по подразбиране, конструкторите за копиране и заданието.