Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Лекція 16

Властивості об'єкта

Псевдополя , доступні для читання і / або запису. Властивості зовні виглядають як поля і використовуються аналогічно доступним полях ( з деякими винятками) , однак фактично при зверненні до них відбувається виклик методів доступу . Таким чином , властивості можна розглядати як «розумні» поля даних , що супроводжують доступ до внутрішніх даних об'єкта -якими додатковими діями ( наприклад , коли зміна координати об'єкта супроводжується його перемальовуванням на новому місці). Властивості , по суті - не більше ніж синтаксичний цукор , оскільки ніяких нових можливостей вони не додають , а лише приховують виклик методів доступу . Конкретна мовна реалізація властивостей може бути різною. Наприклад , в C # оголошення властивості безпосередньо містить код методів доступу , який викликається тільки при роботі з властивостями , тобто не вимагає окремих методів доступу , доступних для безпосереднього виклику . У Delphi оголошення властивості містить лише імена методів доступу , які повинні викликатися при зверненні до поля. Самі методи доступу є звичайні методи з деякими додатковими вимогами до сигнатурі .

Поліморфізм реалізується шляхом введення в мову правил , згідно з якими змінної типу «клас » може бути присвоєний об'єкт будь-якого класу - нащадка її


 

Тема : Створення базових класів, об’єкти. Конструктори та деструктори, this. Статичні та константні поля.

Мета: Вивчити поняття конструктора та деструктора, типи конструкторів, перевантаження конструкторі. Розібрати синтаксис та обмеження роботи з конструкторами та деструкторами.

В об'єктно - орієнтованому програмуванні конструктор класу (від англ. Constructor, іноді скорочують ctor ) - спеціальний блок інструкцій , що викликається при створенні об'єкта.

Конструктор схожий з методом , але відрізняється від методу тим , що не має явним чином певного типу повертаються даних , не успадковується , і зазвичай має різні правила для розглянутих модифікаторів. Конструктори часто виділяються наявністю однакового імені з ім'ям класу , в якому оголошується . Їх завдання - ініціалізувати члени об'єкта і визначити інваріант класу , повідомивши у разі некоректності інваріанта . Коректно написаний конструктор залишить об'єкт в « правильному » стані. Незмінні об'єкти теж повинні бути проініціалізовані конструктором.

Термін « конструктор » також використовується для позначення одного з тегів , що описують дані в алгебраїчному типі даних. Це використання дещо відрізняється від описуваного в статті. Для додаткової інформації дивіться Алгебраїчний тип даних.

У більшості мов конструктор може бути перевантажений , що дозволяє використовувати декілька конструкторів в одному класі , причому кожен конструктор може мати різні параметри .

 

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

Одна з ключових особливостей ООП - інкапсуляція : внутрішні поля об'єкта безпосередньо недоступні , і користувач може працювати з об'єктом тільки як з єдиним цілим , через відкриті ( public ) методи. Кожен метод , в ідеалі , має бути влаштований так , щоб об'єкт, що знаходиться в « допустимому » стані (тобто коли виконується інваріант класу) , після виклику методу також опинився в допустимому стані. І перше завдання конструктора - перевести поля об'єкта в такий стан.

Друге завдання - спростити користування об'єктом . Об'єкт - не «річ у собі» , йому часто доводиться вимагати якусь інформацію від інших об'єктів : наприклад , об'єкт File , створюючись , повинен отримати ім'я файлу. Це можна зробити і через метод:

File file ;

file.open ( " in.txt " , File :: omRead ) ;

Але зручніше відкриття файлу зробити в конструкторі : [ 1 ]

File file ( " in.txt " , File :: omRead ) ;

види конструкторів

Деякі мови програмування розрізняють кілька особливих типів конструкторів :

• конструктор за замовчуванням - конструктор , що не приймає аргументів ;

• конструктор копіювання - конструктор , що приймає як аргумент об'єкт того ж класу ( або посилання з нього) ;

• конструктор перетворення - конструктор , що приймає один аргумент (ці конструктори можуть викликатися автоматично для перетворення значень інших типів в об'єкти даного класу).

class Complex

{
public :

/ / Конструктор за замовчуванням


/ / (У даному випадку є також і конструктором перетворення)
Complex ( double i_re = 0 , double i_im = 0 )
: Re ( i_re ) , im ( i_im )
{}

/ / Конструктор копіювання
Complex ( const Complex & obj )
{
re = obj.re ;
im = obj.im ;
}
private :
double re , im ;
} ;


Конструктор за замовчуванням

Основна стаття : Конструктор за замовчуванням

Конструктор не має обов'язкових аргументів. Використовується при створенні масивів об'єктів , викликаючи для створення кожного екземпляра. У відсутність явно заданого конструктора за замовчуванням його код генерується компілятором ( що на початковому тексті , природно, не відбивається) .

конструктор копіювання

Основна стаття : Конструктор копіювання

Конструктор , аргументом якого є посилання на об'єкт того ж класу. Застосовується в C + + для передачі об'єктів у функції за значенням .

Конструктор копіювання в основному необхідний, коли об'єкт має покажчики на об'єкти , виділені в купі . Якщо програміст не створює конструктор копіювання , то компілятор створить неявний конструктор копіювання , який копіює покажчики як є , тобто фактичне копіювання даних не відбувається і два об'єкти посилаються на одні й ті ж дані в купі . Відповідно спроба зміни « копії » зашкодить оригінал, а виклик деструктора для одного з цих об'єктів при подальшому використанні іншого призведе до обігу в область пам'яті , вже не належить програмі .

Аргумент повинен передаватися саме за посиланням , а не за значенням . Це випливає з колізії : при передачі об'єкта за значенням (зокрема , для виклику конструктора ) потрібно скопіювати об'єкт. Але для того , щоб скопіювати об'єкт , необхідно викликати конструктор копіювання.

конструктор перетворення

Конструктор , що приймає один аргумент. Задає перетворення типу свого аргументу в тип конструктора . Таке перетворення типу неявно застосовується тільки якщо воно унікальне .

Віртуальний конструктор

Конструктор не буває віртуальним в сенсі віртуального методу - для того , щоб механізм віртуальних методів працював , потрібно запустити конструктор , який автоматично налаштує таблицю віртуальних методів даного об'єкта.
« Віртуальними конструкторами » називають схожий , але інший механізм , присутній у деяких мовах - наприклад , він є в Delphi , але немає в C + + і Java. Цей механізм дозволяє створити об'єкт будь-якого заздалегідь невідомого класу за двох умов:
• цей клас є нащадком якогось наперед заданого класу (у даному прикладі це клас TVehicle ) ;

• на всьому шляху наслідування від базового класу до створюваного ланцюжок перевизначення не обривати . При перевизначенні віртуального методу синтаксис Delphi вимагає ключове слово overload , щоб стара і нова функції з різними сигнатурами могли співіснувати , override для перевизначення функції або reintroduce для завдання нової функції з тим же ім'ям - останнє неприпустимо.

type
TVehicle = class

constructor Create ; virtual ;
end ;

TAutomobile = class ( TVehicle )
constructor Create ; override ;
end ;

TMotorcycle = class ( TVehicle )
constructor Create ; override ;
end ;

TMoped = class ( TMotorcycle ) / / обриваємо ланцюжок перевизначення - заводимо новий Create
constructor Create ( x : integer ) ; reintroduce ;
end ;
У мові вводиться так званий класовий тип ( метаклассом ) . Цей тип як значення може приймати назву будь-якого класу , похідного від TVehicle .
type
CVehicle = class of TVehicle ;
Такий механізм дозволяє створювати об'єкти будь-якого заздалегідь невідомого класу , похідного від TVehicle .
var
cv : CVehicle ;
v : TVehicle ;

cv : = TAutomobile ;
v : = cv.Create ;
Зауважте , що код
cv : = TMoped ;
v : = cv.Create ;

є некоректним - директива reintroduce розірвала ланцюжок перевизначення віртуального методу , і насправді буде викликаний конструктор TMotorcycle.Create (а значить , буде створений мотоцикл , а не мопед !)

Див також Фабрика ( шаблон проектування )

Синтаксис С + +

Ім'я конструктора має збігатися з ім'ям класу. Допускається використовувати кілька конструкторів з однаковим ім'ям , але різними параметрами.

приклад
class ClassWithConstructor {
public :
/ * Ініціалізація внутрішнього об'єкта за допомогою конструктора * /
ClassWithConstructor ( float parameter ) : object ( parameter ) { } / * виклик конструктора AnotherClass ( float ) ; * /
private :
AnotherClass object ;
} ;

Статічні члени класів

• Статічні дані -члени (поля) класів Використовують для Збереження Даних, спільніх для всіх екземплярів класу , Наприклад , кількість екземплярів класу , вказівнік на вершину дінамічного списку , Деяк глобальну для Всього класу константу , тощо . Статичний член класу має буті продекларованім у класі з помощью службового слова static , а процес віділення под нього пам'яті та йо ініціалізація відбувається поза класом .

• звертання до статичних членів можливе через имя класу або через ідентифікатор екземпляр (В С # - Тільки через имя класу ) .

• На статічні члени розповсюджуються звічайні правила доступу .

• Слід зауважіті , что в класі присутности позбав декларація статичного члену , для его создания звітність, віділіті пам'ять под нього та в разі необхідності проініціалізуваті - це відбувається поза межами класу , даже ЯКЩО статичність член задекларованого як закритий . Більше того , ЯКЩО статичність член класу ( скалярного типу ) поміченій СЛУЖБОВЕ словом const , то ВІН может буті проініціалізованій в класі , альо пам'ять под нього Все рівно має буті віділена поза класом !

• Операція sizeof НЕ враховує пам'ять , віділену под статічні поля.
Приклад .

• Приклад .

• class Example
• {
• public :
• static int num ; / / декларація статичного члену класу
• int key ;
• Example ( int key_ ) : key ( key_ ) { }
• } ;
• / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
• int Example :: num ; / / віділення пам'яті под статичність член
• / / в разі відсутності ініціалізації ВІН = 0
• / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
• int main ( int argc , char * argv [])
• {
• Example e ( 1 ) , f ( 10 ) ;
• cout << Example :: num << endl ; / / звертання через имя класу
• Example :: num = 100 ;
• cout << e.num << endl ; / / звертання через имя екземпляр
• cout << f.num << endl ; / / звертання через имя екземпляр
• e.num = 1000 ;
• cout << e.num << endl ;
• cout << f.num << endl ;
• system ( " PAUSE" ) ;
• return 0 ;
• }

 

 

Статічні Функції -члени класів Використовують Тільки для звертання до статичних Даних -членів и НЕ могут використовуват звічайні дані та методи класу , Адже я смороду НЕ прив'язані до екземпляр , їм НЕ передається вказівнік this .

• Статічні Функції -члени класів Використовують Тільки для звертання до статичних Даних -членів и НЕ могут використовуват звічайні дані та методи класу , Аджея смороду НЕ прив'язані до екземпляр , їм НЕ передається вказівнік this .

• Службове слово static вказується позбав у декларації статічної Функції , при ее візначенні воно НЕ повторюється .

• звертання до статичних методів так само может відбуватісь и через имя класу , и через ідентифікатор екземпляр .

• Слід зауважіті , что звічайні Функції -члени класу мают право працювати Із статичності членами класу .

• Конструктор та деструктор НЕ могут буті статичність !

 


 


Читайте також:

  1. Вид заняття: лекція
  2. Вид заняття: лекція
  3. Вид заняття: лекція
  4. Вид заняття: лекція
  5. Вид заняття: лекція
  6. Вступна лекція
  7. Вступна лекція 1. Методологічні аспекти технічного регулювання у
  8. Клітинна селекція рослин.
  9. Колекція фонограм з голосами осіб, які анонімно повідомляли про загрозу вибуху
  10. ЛЕКЦІЯ (4): Мануфактурний період світової економіки
  11. Лекція - Геополітика держави на міжнародній арені
  12. Лекція 02.04.2013




Переглядів: 639

<== попередня сторінка | наступна сторінка ==>
Контроль доступу | Лекція 17

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.017 сек.