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


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


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


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


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


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


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


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


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


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



Контакти
 


Тлумачний словник
Авто
Автоматизація
Архітектура
Астрономія
Аудит
Біологія
Будівництво
Бухгалтерія
Винахідництво
Виробництво
Військова справа
Генетика
Географія
Геологія
Господарство
Держава
Дім
Екологія
Економетрика
Економіка
Електроніка
Журналістика та ЗМІ
Зв'язок
Іноземні мови
Інформатика
Історія
Комп'ютери
Креслення
Кулінарія
Культура
Лексикологія
Література
Логіка
Маркетинг
Математика
Машинобудування
Медицина
Менеджмент
Метали і Зварювання
Механіка
Мистецтво
Музика
Населення
Освіта
Охорона безпеки життя
Охорона Праці
Педагогіка
Політика
Право
Програмування
Промисловість
Психологія
Радіо
Регилия
Соціологія
Спорт
Стандартизація
Технології
Торгівля
Туризм
Фізика
Фізіологія
Філософія
Фінанси
Хімія
Юриспунденкция






Лекція 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




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

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

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

 

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


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