1. Обекти и класове Дефиниция на клас. Общи понятия и концепции



страница1/3
Дата18.11.2017
Размер0.6 Mb.
Размер0.6 Mb.
  1   2   3

1.       Обекти и класове Дефиниция на клас. Общи понятия и концепции.

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

Синтаксис на дефиниция на клас:

1.  class име_на_клас

2.  {

3.   тяло_на_клас

4.  };

Eтикетите public и private се наричат спецификатори за достъп до елементите. Данните-елементи и функциите-елементи декларирани след public до следващия спецификатор за достъп се наричат открити и те са достъпни при всяко обръщение от програмата към обект от класа. Данните-елементи и функциите-елементи декларирани след private до следващия спецификатор за достъп се наричат закрити и те са достъпни само за функциите-елементи от този клас. Спецификаторите за достъп завършват с ‘:’, могат да се появяват многократно в дефиницията и в произволен ред. Препоръчва се, обаче, в дефиницията на клас всеки спецификатор за достъп до елемент да се използва само веднъж, започвайки с public.

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

Описване на функция извън класа – клас::функция

Функция-елемент, описана извън дефиницията на класа, може да бъде направена вградена чрез явно използване на ключовата дума inline

Функция със същото име, както на класа, но започваща с ‘~’ се нарича деструктор на този клас. Деструкторът изпълнява завършващи служебни действия на всеки обект на класа, преди паметта, разпределена за този обект да бъде повторно използвана от системата.

2.    Методи и параметри. Даннови членове. Инстанция на обект.



3. Класове и обекти. Преход от структура към клас.

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

Обектите представляват единство на своите физически и функционални характеристики

Множество от обекти със сходни характеристики на поведение и състояние се нарича клас.

Екземплярът е конкретен обект, принадлежащ на даден клас.

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

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

В структурата може да има функции, както и функциите на класа може да бъдат премахнати. Структурата може да има и конструктор и деструктор.

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

Обект (object) е близък до класическата структура (record), но съдържа освен

даннови полета собствени методи (процедури и функции) за работа с данните.

Класът е нещо много близко до обекта.

Обаче има две съществени разлики.

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

такива полета вече се наричат свойства (properties), те НЕ кореспондират пряко с променливи.


Втора разлика: класът е непременно динамична променлива, тоест компилатора

не може да заеме място за нея, това става в Run-Time, при споменаване на Create - конструктора, докато обектът може да е и статичен

4. Конструктори и деструктори



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

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

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

Деструкторът е специална функция елемент на класа. Името на деструктора съвпада с името на класа, но пред него се поставя символ ‘~’. Мнемониката е, че ‘~’ означава поразрядно логическо отрицание. И така деструкторът може да се разглежда като отрицание на конструктора. Деструкторът на класа се извиква при унищожаване на обекта. Например, деструкторът за даден обект се извиква когато изпълнението на програмата напусне областта на действие на този обект. В действителност, самият деструктор не унищожава обекта, той извършва завършителни действия, преди системата да освободи паметта, в която е бил съхраняван обекта. Деструкторът няма параметри и не връща резултат. Не се разрешава предефиниране на деструктора, т.е. един клас може да има само един деструктор.На практика деструкторите рядко се използват в обикновени класове; деструкторите имат смисъл за класове, които използват динамично разпределение на паметта за обектите.

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

5. Типове променливи и оператори в клас. Основни типове данни.

6. Указатели и референции. Константи. Изброими типове.

В С++ има различни типове променливи – за цели числа, за числа с десетична запетая, за символи, низове и тн. Примери за типове променливи са : char, short int, int, float, double , bool и тн.

Оператори: В езика С++ има богат набор от оператори.В него са дадени също и средства за предефиниране.

Всеки оператор се харектеризира с :

-позиция на оператора спрямо аргомента му;

-приоритет

-асоциативност;

Позицията на оператора, спрямо аргумента му го определя като:

префиксен(оператора е пред единствения си аргумент --i),

инфиксен(оператора е между аргументите си- 4+2),

постфиксен(оператора е след аргументите си i++).

Приоритетът на оператора определя редът на изпалнение на операторите.Оператора с по-висок преоритет се изпалнявя преди оператора с по-нисак преоритет. (Пример: Преоритета на * и / е по-висок от този на + и -).

Асоциативността определя реда на изпълнение на операторите с еднакъв преоритет. В С++ има ляво асоциативни и дясно асоциативни оператори. Ляво асоциативните оператори се изпалняват от ляво на дясно, а дясните - от дясно на ляво. В С++ не може да се дефинират нови оператори, но всеки съществуващ вече оператор с изключение на ::, . , ?: и .* може да бъде предефиниран от програмиста, стига поне един операнд на оператора да е обект на някакъв клас.

За предефинирането на оператор се съзадава операторна функция. Най-често

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

Операторите биват : за присвояване( = ), бинарни( + , - и тн), релационни и логически (примерно == и && ), унарни (пример: ++ ), оператор за индекс ( [ ] ) и др .

Основни типове данни

- Цели числа (int: 2-4 байта и лонг минимум 4 байта): 8, -54, 1289

- Дробни числа с плаваща – float или фиксирана точка - double: 0.01, 12.5, 73.0, 21.0E2

- Символни имена (идентификатори):

Аритметични операции в С++.

+/- - събиране и изваждане

*,/,% - умножение, деление, остатък от деление

Особености:

- Приоритети - както в математиката (най-напред се извършват действия *, / и % и след тях + и -)

- Използване на скоби за промяна на реда на изпълнение на аритметичните операции.

- Аргументна зависимост - действието на операцията зависи от типа на аргументите.

- Двата аргумента на аритметичните операции трябва да са от един и същи числов тип данни; резултатът е от същия тип.

- Разрешено е единият от аргументите да е от тип double/float, а другия - от тип int; тогава аргумента от тип int се преобразува (автоматично) на тип double и след това се извършва аритметичната операция - с аргументи тип double.

7. Предаване на данни като параметри. Accessor-методи. Mutator-метод.



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

Други функции пък връщат на извикващия определен тип данни, чрез променлива от зададеният тип.

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

В класа може да има 3 вида функции

* функции които задават стойност на аргументите на класа

*функции които връщат стойността на аргументите на класа

*функции които извършват логическа операция с аргументи на класа по даден алгоритъм/свойство

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

Mutator методите за използват за задаване/променяне на стойностите на членовете на класа. Организират външият достъп до член данните и са видими извън класа и неговите наследници. Не връщат резултат от даден тип (освен ако не връщат true/false за изпълнена промяна на стойности)

8. Общи понятия:функции; декларация на прототип; дефиниране на функция;

повикване на функция; работа с локални и глобални типове; дефиниране и

използване на overloaded функции.

Функция : Функция на C++ е начин да се разделят блоковете код на части. Те предоставят на програмиста начин да раздели програмата си така, че да не трябва непрекъснато да се пише един и същи код, а просто да извика функцията. Чрез функциите кода се поддържа малък, чист и функционален.

 

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



тип име (параметри);

дефиниране на функция: описва се логическият блок код на функцията

 тип име (параметри)

   {


тяло

   }

повикване на функция:

име (параметри); - ако функцията е без тип

променлива = име (параметри) - променливата е от същият тип като функцията

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

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

дефиниране и използване на overloaded функции: Overload функции, т.е работят по натоварване. Такива фунцкии или процедури се наричат, overloaded, когато са декларирани фунции с едно и също име, с разлика вид и брой аргументи. При извикване на такива функции, зависи от това какви агрументи са подадени, за да се включи съответната функция.


9. Функции –методи. Глобални функции


10. Припокриване на функции

11. Локални променливи. Локални и/или глобални елементи на клас.

12. Взаимодействия на обекти.Понятие за абстракция и модулност.

13. Програмни практики: цифров часовник: диаграми на класове и обекти; проект и

програмни елементи.

14. Групиране на обекти.Колекции и итератори . Програмни практики: проект

‘notebook’; обектна структура, използване на колекции.

15. Проектиране на класова йерархия в обектно-структурирана програма.

16. Оценка на качеството на кода. Свързаност и структурираност на кода.

17. Качество на код: дублиращи се фрагменти. Целево-ориентиран проект.

18. Проблеми в проектиране и ООП. Водещи практики.

19. Класове и обекти: разделяне на декларация и дефиниция. Създаване и

унищожаване на обекти.

20. Дефиниране на конструктори и деструктори. Методи на класа.

21. Дефиниране на връзки.

22. Наследяемост. Подтипове. Замествания. Полиморфизъм и променливи.

Наследяване в ООП наричаме възможността един клас, наричан наследник, да придобие свойства и действия на друг клас – родител (базов клас).



Наследяемост:

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

връзка

- Класовете могат да се дефинират по-общо и после да се конкретизират в по-точни



подкласове

- Всеки подклас включва или наследява (inherit) всички свойства на родителския си

клас (super class) и добавя свои уникални свойства

Полиморфизъм (polymorphism) е способността на един обект да съществува в

различни форми. Полиморфизмът дава възможност да използвате един и същ метод за

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

реализацията на метод от базовия клас. Следователно, когато от един базов клас

създавате два производни класа, можете да създадете метод с едно и също име и в двата

класа. Но методът във всеки от производните класове изпълнява различни задачи.

Избира се кой метод да се извика в зависимост от това от кой обект се вика. Пример:

Animal *ptr = new Cat(…);

ptr->speak();

ptr = new Dog(…);

ptr->speak();

23. Програмни практики: разнородни обекти в бази от данни. Проект: обектен модел,

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

подкласове. Наследяемост.

24. Създаване на проекти с дълбока йерархия.

25. Подтипове, подкласове и присвоявания. Предаване на параметри.

26. Полиморфични променливи.

27. Наследяемост в ООП . Дефиниране на йерархията. Достъп до методи и данни на

различни нива.

28. Виртуални елементи и реализация на полиморфизма. Абстрактни класове и

абстрактни методи.

29. Програмни практики: наследяемост и поломорфизъм в програма.

30. Виртуални функции викане на виртуални функции на базов клас.

31. Вграждане на обекти. Copy – конструктори.

32. Присвоявания и обекти.

33. Референтни параметри (const или non-const). Работа с референции.


34. Връщане на референтни обръщения.


Returning references

Дадена функция може да върне референция (това е еквивалентно на връщането на pointer)



const double& XY::GetConstX() const {return x};

Така декларирано функцията връща константна референция до XY object и може да се използва само от дясната страна на присвояването:



my.GetConstX() = 1.0; // is wrong!!!

returning reference from a function

Грешка в C е следното:

int *GetInt()

{

int result = (int) (rand() / 1000);

return &result; // dont do this!!

}

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

еквивалентна С++ грешка:

int& GetInt()

{

int result = (int)(rand() / 1000);

return result;

}

//the compiler is still returning a pointer to a temporary variable
35. Конструиране на вградени обекти. Деструкция на вградени обекти.
Constructing embedded objects

II part orbiter
Planet Spaceship

1. Компилаторът има декларацията на обекта. От където следва че той знае колко памет трябва за Spaceship object и разпределя(allocates) тази памет.

2. всички вградени обекти (m_current, m_prior, m_thrust) са конструирани

3. Orbiter constructor се извиква

4. m_orrientation вградения обект се извиква.

5. Spaceship constructor функция се извиква.

Това е листа за конструкцията

The class design и синтаксиса на Spaceship constructor определят точно кой конструктур ще се извика(default, explicit or copy)




Сподели с приятели:
  1   2   3


©zdrasti.info 2017
отнасят до администрацията

    Начална страница