С класове, propascal - всичко за програмисти
C ++ класове
От всички езици, които поддържат методология обектно-ориентираното програмиране, C ++, може би тя осигурява най-голяма възможност и най-голяма гъвкавост, за да управлява създаването на класове и обекти, достъп до членовете на класове, управление на паметта, разпределя обекти. Въпреки това, нищо безплатно не се случи, и силата и гъвкавостта в ++ езика C трябва да се плаща и не-очевидни сложност на много от проектите му.
Синтаксис описание на класа
BazovyeKlassy е даден списък с имена на базовите класове, показващи достъпа Спецификаторите до основни класове. Ако този клас все още няма базови класове, този списък не мога да пиша (а не сложи прелюдия към дебелото му черво).
И в класа членове на дефиницията на клас може да бъдат обявени само, но ще бъдат описани по-късно. Например:
Важно! Обявените (но все още не са определени) класовете могат да се използват само когато не е необходимо да се знае размера на паметта, разпределени от клас обект - това е, използването на разрешени, но не и имената на някои класове е разрешено само указатели и референции описания:
(Перспектива: проблемът изглежда само пресилено в GroupX клас (по подразбиране), определен от проектанта, който ще трябва да създадете обекти т класа, нищо за тях, без да го знаят.).
Този проблем не се среща в други езици за програмиране (като Delphi, Java или C #), в които достъпът до обекта на класа отива само chereh указатели. Въпреки това, в C ++ клас обект се счита за данни (битова последователност) на, а не като указател към данните.
Право на достъп до методите и полетата на класа
В C ++, има три нива на права за достъп до членовете на класа.
Членовете на класа са декларирани в публичните секции, достъпен от всяка точка на програмата.
Членовете на класа са декларирани в раздели защитени, достъпни само за самата (и методи) клас, както и в деривативни класове от него.
Полета и методи са обявени за частна, са достъпни само в рамките на един клас (и методи), както и "приятелски" класове. Това ниво на достъп се отнася и за всички членове на класа, към който правата за достъп не са посочени изрично.
Често е налице ситуация, в която няколко различни класове са тясно свързани един с друг. Например, ако библиотеката клас е създаден за работа с векторна алгебра, включително класовете Матрицата и Vector, че не е възможно трудно да се отделят тези класове, това е много издръжлив, те са свързани. И ако ви даде Matrix класа имат достъп само до публични членове на вектора на класа, операцията между матриците и векторите ще бъде трудно да се прилагат с необходимата ефективност. Ако оповестено вътрешно представяне на вектора, а след това ще загубите това важно качество на обектно-ориентиран модел и подробности по изпълнението капсулиране в един клас.
За да се позволи достъп до вътрешния представителството на класа само за някои други класове, като така се забранява такъв достъп по целия път, концепцията за "приятелски клас" е въведена в C ++. Клас, този лесен за употреба, има достъп до всички свои членове, включително тези, декларирани като лични.
На конструктора да се инициализира обекти от този клас (а именно инициализация и не създаването на обекта може да се постави не само в динамично разпределена памет, но и на купчината (като локална променлива на функция).
Feature C ++ конструктори, които се наричат, когато обектът не е създаден до края. Ето защо, има ограничения за обжалване от проектанта на другите методи клас (най-вече за виртуални методи).
Синтаксис описания дизайнер
Конструкторът в C ++ има същото име като името на класа, и може да има параметри (или не ги има):
Има два конструктори са описани: един без параметри (и тя ще бъде използвана като конструктор по подразбиране), а другият - с един параметър от тип низ.
И сега създават и обекти:
С х; // конструктор по подразбиране се нарича
// се показва // п = 0 С у =
«Abc»; // конструктор се нарича с параметър низ
се показва // // п = 3 C Z ( «ABC"); // в предишния случай
// се показва // п = 3 C * р =
нова C (); // обект се създава в динамично разпределение на паметта
// ще бъдат показани // п = 0 ° С * р =
Новата C ( «ABCD»); // друг генерира динамично
обект
// се показва // п = 4
Това означава, че строителят се нарича:
• когато изрично се създаде обект в динамично разпределена памет, с помощта на оператор нов;
• При инициализиране на описаните променливи и членовете на класа;
• Когато копирате обекти (но повече за това по-долу).
Важен вид конструктор е така наречената "копие строителя". На строителя на копие се смята за по-конструктор с един параметър (или с първата опция, ако други параметри имат стойности по подразбиране) са:
• Конст препратка към обекта на класа;
• връзка с обекта на класа;
• нестабилна (летливи) или постоянна връзка нестабилна връзка с обекта на класа.
На строителя на копие се нарича:
• Инициализация създаден обект с друг обект от същия клас;
• прехвърляне на параметъра (не показалеца!) За функцията;
• При връщане на стойността (не показалеца!) На функцията;
• При копиране на задание обект (но само ако класът не е бил променен от назначението на оператор!).
На строителя на копие и оценка
Възможност за C ++ дефинира като конструктор копие и оператор задача да замени класа изисква особено внимателни относно използването на оператора за присвояване в такива случаи, защото трябва да се знае точно това, което ще се нарича: строителя копие и оператора задача. Например:
>;
И сега всичко това приложение:
А А1; // наречен А () за инициализиране на конструктора
а
А а2 (а1);
// копие конструктор се нарича
А А3 = А2;
// копие конструктор се нарича отново
Б б;
А а4 (б);
// конструктор се нарича (конст В), // от променливата
// обект се инициализира с клас B
А А5 = В;
// конструктор се нарича (конст В)
а1 = a5;
// наречен пренаписани оператор задача
А2 = б;
// Е, тук - пълноценна почивка:
// - обект на б създава временен обект от клас А
// конструктор, като се използва (конст В)
// - пренаписани използване оператор задача,
// възложи на променлива а2 създаден временен
Destructor е обявен в C ++, както следва:
Име на класа ();
Неговата цел - да се подготвят обекта за премахване. Например, освобождаването на заловените обект ресурси.
Деструкторът се нарича точно преди освобождаването на паметта, предвидено за обекта:
• когато изрично изтриете обект, който се поставя в купа, като се използва за изтриване оператора;
• на изхода на променливата, чиято стойност е обекта (наименование на обекта, а не указател към обект!) Извън обхвата.
Destructor може да бъде обявена за виртуално и подтиснат в извлечен клас.
Тази ключова дума
Тази ключова дума осигурява достъп от методите на класа, към указател към самия обект на класа. това е:
• Име индекс (независимо от това колко е създаден обекта);
• Конст показалеца, това е, методи на клас не могат да променят стойността си.
Първостепенни нови и изтриване на операторите
Новият оператор се използва за създаване на обекти в динамично разпределена памет, а оператор изтриване се използва за премахване на вече създадените динамично разпределени обекти на паметта. C ++ позволява програмист да се преодолеят тези оператори, като по този начин създаване на механизъм за управление на паметта.
Замени на новия оператор трябва да е първия параметър от тип size_t (видовете, използвани в C ++, за да определите размера на паметта, а в действителност е цяло число) и да се върне празно пространство * (тоест, един типизиран указател) е показалец към заделената памет за обекта ,
Замени на изтриване оператор трябва да имат параметър от тип нищожен *, което показва, паметта, заета от подвижен обект.
И оператор нова, оператор и изтриване са статични методи, и следователно не са в състояние за достъп до данни, създадени или изтрити обект. (Въпреки това, тъй като нищожен * показалеца на може да се превърне указател към обект клас, програмистът може да получи до данните на обекта, но не и да го направят. - Има конструктори и деструктори за манипулиране на данни за създаване и изтриване на обекти).
Наследяване позволява да се определи получен клас като продължение на базовия клас. Освен това, всички членове на базовия клас съществува в извлечения клас. Но не всички от тях са на разположение и правила за работа за достъп.
Отново, за разлика от други обектно-ориентирани езици (Java, Delphi, C #), C ++ не е обща за всички класове на базовия клас. Всеки клас, който не е посочен базови класове е една от (вероятно много) върха на йерархията на класовете.
C ++ - един от малкото езици, които позволяват на множество наследство, което означава, че класа може да има няколко базови класове. В този потомък клас ще получите всички от членовете на неговия базов клас. Много опростена описание на класа
Struct D: В1, В2
Int п;
>
Тя може да се разглежда като
структура D
В1 __b1;
B2 __b2;
Int п;
>
В този случай, за да получите достъп до В1 и В2 членове не трябва да допълнително да посочите "имена на полета» __b1, __b2 и достъп до името си директно от класа на обекта D. Въпреки това (както е обичайно в C ++), има някои нюанси, които ще бъдат обсъдени по-долу ,
Това е един много мощен инструмент, който в много случаи е естествено да се опише структурата на данните, без да въвежда допълнителни понятия (като в Java «интерфейси», Delphi или C #). Но (както и при други мощни C ++ дизайни) за тези богати възможности за заплащане увеличава сложността. Например:
В C ++ има (и доста сложни) правила, които да позволят по-голямата част от тези сблъсъци. Но в много случаи е по-добре да се уточни изрично какво е заложено на карта, с помощта на пространство от имена представки:
Множествена наследство, а това
Внимание! Поради възможността за множествено наследяване, тази стойност указател в получен клас обект може да се различава от тази на показалеца стойности в предмета на базовия клас (особено ако базовия клас не е на първо място в списъка на база клас)!
Абстрактни класове и чисти виртуални функции
Класът, който съдържа най-малко една чисто виртуална функция се нарича "абстрактен клас." не могат да се създават абстрактни обекти клас (включително абстрактен клас не може да се опише променливите, въпреки че е възможно да се опише указател към обектите абстрактен клас - техните стойности могат да бъдат указатели към класове потомък обекти.
Лесна и виртуална наследство
Да предположим, че има такава йерархия клас:
клас А
публичния:
Int п;
невалидни е ();
>
клас В1: обществен A
>
клас B2: обществен A
>
и С клас, който произтича от и В1 и В2 от.
клас С е дете на клас А и клас В1 през и чрез клас В2. Следователно, и включва поле п и метод е (). В този случай, има неясноти: какъв начин (чрез В1 или чрез В2) има препратка към област п и F на метод () от клас C? И като цяло, колко полета н е клас C обект? Само един? Или едно поле за B1 :: н и още един за B2 :: н? И ако и начин е () ще бъде заменен в един от класовете, В1 или В2 (и дори в двата класа)? Ясна индикация на името на класа, когато се отнася до метода не реши проблема.
Ето защо, в C ++ е въведена възможност за виртуална наследство: в декларацията на класа, за да уточни, че се наследява базовия клас виртуална, а след това, наследени полета и методи ще бъдат споделени с други виртуални наследници базов клас. В противен случай, всеки клас ще има свой собствен набор от наследени полета и методи. Например:
клас А
публичния:
Int п;
невалидни е ();
>
клас В1: виртуална публична A
>
клас B2: виртуална публична A
>
клас C: обществен B1, B2 обществен
>
В този случай, В1 и В2 класове, наследяване от тях С-класа, членовете споделят общ клас А, като наследяване от А обявен виртуално.
И ако не е имало виртуален ключова дума:
клас А
публичния:
Int п;
невалидни е ();
>
клас В1: обществен A
>
клас B2: обществен A
>
клас C: обществен B1, B2 обществен
>
в членове C-класа на клас А «умножава» до (отделно за наследство чрез В1 и отделно за наследство чрез В2). За всеки "копие" могат да бъдат достъпни чрез посочване на името на базовия клас, чрез които членът е наследил. Например,
C * х = нов C ();
х-> В1 :: е ();