Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Class Dot. // конструктори з параметрами




{

char name;

double x, y;

public:

// конструктори з параметрами

Dot (char Name, double X, double Y) { name = Name; x = X; y = Y; }

Dot (char Name): name(Name), x (0), y (0) { }

Dot (char Name, const Dot& A) { name = Name; x = A.x; y = A.y; }

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

Dot (const Dot& A) { name = (char) 226; x = A.x; y = A.y; }

void Print ();

};

void Print ()

{cout<<”x=”;}

void main ()

{

Dot A ('A', 3, 4); // виклик конструктора Dot (char Name, double X, double Y)

Dot B ('B'); // виклик конструктора Dot (char Name)

!! Dot C (A); // виклик конструктора копіювання Dot (const Dot& A)

C.Print ();

!! Dot D = B; // виклик конструктора копіювання Dot (const Dot& A)

D.Print ();

Dot E ('E', A); // виклик конструктора Dot (char Name, const Dot&)

E.Print (); // виводить на екран: Координати крапки E: x=3 y=4

}

У наведеному прикладі крапки C і D оголошені за допомогою конструктора копіювання, де ім'я крапки ініціалізуються фіксованим значенням – російською буквою “ т ”.

Конструктор:

Dot (char Name, const Dot& A) { name = Name; x = A.x; y = A.y; },

у якості параметрів приймає ім'я й крапку, координати якої використовуються для ініціалізації.

Покажчик 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 буде містити кількість існуючих об'єктів незалежно від того яким образом і в якій області визначення створений або знищений об'єкт.

Статичні функції - члени класу

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

У зв'язку із цим їм не передається покажчик this. Ця особливість статичних функцій-членів використовується при написанні функцій-оброблювачів переривань і callback-функцій (при програмуванні для Windows).

Зі сказаного вище випливає кілька важливих наслідків:

статична функція-член може викликатися незалежно від того, існує чи ні який-небудь представник класу;

статична функція-член може маніпулювати тільки статичними даними-членами класу й викликати тільки інші статичні функції-члени класу;

статична функція-член не може бути оголошена з модифікатором virtual.

Константні дані - члени класу

Данні-члени класу може бути оголошений з модифікатором const, який указують перед типом константного даного. Ключове слово const інформує компілятор, що значення даного елемента об'єкта не повинне змінюватися після ініціалізації. Константні дані-члени класу не можна ініціалізувать у конструкторові звичайним образом. Список ініціалізації є єдиним методом ініціалізації даних-констант. Приведемо приклад оголошення константного даного і його ініціалізації:

class Dot

{

const char name; // ім'я крапки – константне дане-член

double x, y; // координати крапки

public: // відкриті члени класу

Dot (char Name, double X, double Y): name (Name), x (X), y (Y) { }

Dot (char Name): name (Name), x (0), y (0) { }

};

Константні функції - члени класу

Функція-член класу може бути оголошена з модифікатором const, який іде за списком параметрів. Така функція не може змінювати значення даних-членів класу й не може викликати не константні функції-члени класу. Приведемо приклад оголошення константної функції-члена класу:

class Coord

{

// базовий клас координат

double x, y; // координати

public: // відкриті члени класу

Coord () { x = 0; y = 0; } // ініціалізує координати нулями

double Getx () const { return x; } // константна функція повертає коорд x

double Gety () const { return y; } // константна функція повертає коорд y

void Setx (double X) { x = X; } // встановлює задане знач коорд x

void Sety (double Y) { y = Y; } // встановлює задане знач коорд у

};

Константні об'єкти

Можна також створювати константні об'єкти. Для цього перед їхнім оголошенням ставлять модифікатор const. Наприклад,

const Coord A (3, 5);

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

 




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 446; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.026 сек.