
- •Конструктори і деструктори
- •Правила для конструкторів
- •Правила для деструкторів
- •Список ініціалізації елементів
- •Конструктори за замовчуванням
- •Конструктори копіювання
- •Покажчик this
- •Статичні дані- члени класу
- •Статичні функції - члени класу
- •Константні дані - члени класу
- •Константні функції - члени класу
- •Константні об'єкти
Покажчик this
Кожний об'єкт в C++ містить спеціальний покажчик з іменем this, який автоматично створюється самим компілятором і вказує на поточний об'єкт. Типом this є Т*, де Т – тип класу поточного об'єкта. Оскільки покажчик this визначений у класі, область його дії – клас, у якім він визначений. Дружнім функціям і статичним функціям-членам класу покажчик this не передається.
// функція повертає крапку - середину відрізка, кінці якого задані
Dot& Dot :: Middle ( Dot A, Dot B )
{
x = ( A.x + B.x ) / 2.0 ; y = ( A.y + B.y ) / 2.0 ;// обчислює середину відрізка
Print ( ) ; // виводить на екран координати поточної крапки
this -> Print ( ) ; // усі три оператори еквівалентні
(*this) . Print ( ) ;
return *this ; // повертає посилання на поточну точку
}
Виклик функцій може здійснюватися як безпосередньо по імені, так і за допомогою покажчика this. На практиці таке вживання покажчика this зустрічається вкрай рідко. В основному покажчик this використовується для повернення покажчика ( у формі: return this ;) або посилання ( у формі: return *this ;) на відповідний об'єкт. Цей покажчик знаходить широке застосування при перевантаженні операторів.
Статичні дані- члени класу
Члени класу можуть бути оголошені з модифікатором static. Дане-член класу, визначене з модифікатором static, розділяється всіма представниками цього класу; існує тільки один екземпляр цієї змінної.
Пам'ять під статичні дані-члени виділяється, навіть якщо немає ніяких представників класу. Тому клас повинен не тільки повідомляти статичні дані-члени, але й визначати їх. До статичних даних-членам, оголошеним у розділі public класу, рекомендується звертатися за допомогою наступної конструкції:
<ім'я_класу> :: <дане_член>
Ця форма звертання відображає той факт, що відповідне дане-член є єдиним для всього класу.
Якщо статичні дані-члени оголошені як закриті, то доступ до них можна одержати за допомогою звичайних функцій - членів. Доступ до статичних даних-членам за допомогою звичайних функцій членів нічим не відрізняється від доступу до інших даних-членам, але для цього необхідно створити хоча б один об'єкт даного класу. У зв'язку зі сказаним вище, можна дати наступні рекомендації:
застосовуйте статично дані - члени для спільного використання даних декількома об'єктами класу;
обмежте доступ до статичних даних-членам, оголосивши їх у розділі protected або private.
Розглянемо приклад використання статичного даного члена класу:
#include<iostream>
#include<windows.h>
using namespace std;
class Dot
{
static int count;
// оголошення статичного даного члена – лічильника об'єктів
public: // відкриті члени класу
Dot ( char Name )
{ name = Name x = 0; y = 0 ; count ++ ; } //збільшення лічильника об'єкта на 1
~dot ( ) { count -- ; }// деструктор зменшує лічильник об'єктів на 1
void Printcount ( ) ; // функція виводить кіл існуючих об'єктів
} ;
Файл Dot.cpp
#include "Dot.h" // підключення заголовного файлу класу Dot
void Dot :: Printcount ( )
{
char S [ 30 ] ;
cout<<"У пам'яті існує "<<count <<" об'єкта типу Dot\n";
}
Файл Main.cpp
#include "Dot.h" // підключення заголовного файлу класу Dot
int Dot :: count = 0 ; // ініціалізація статичного даного-члена
void main ( )
{
Dot A ('A'), B ( ’B'), C ( ’C') ; // виклик конструктора Dot ( char Name )
A.Printcount ( ) ;
cout<<Dot :: count<< '\n' ; // помилка: дане-член count недоступний
}
У цьому прикладі статичне дане-член count містить кількість існуючих об'єктів. Ініціалізація даного-члена count здійснюється перед виконанням програми й створенням об'єктів у файлі основної програми за допомогою оператора:
void Dot :: count=0;
Зверніть увагу, що звертання до цього члена класу у функції main ( ) в операторові
cout<<Dot :: count<< '\n' ;
приводить до помилки, оскільки дане-член класу count оголошене як закрите і є недоступним за межами класу.
При виконанні програма виводить на екран:
У пам'яті існує 3 об'єкта типу Dot
Коректний облік кількості існуючих об'єктів досягається двома діями: кожний конструктор, ( у тому числі й конструктор копіювання) збільшує лічильник на одиницю, деструктор – зменшує на одиницю. Оскільки конструктор викликається при створенні кожного об'єкта, а деструктор – при знищенні, то дане-член count буде містити кількість існуючих об'єктів незалежно від того яким образом і в якій області визначення створений або знищений об'єкт.