Студопедия

КАТЕГОРИИ:


Архитектура-(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




Class Dot

Destructor

Constructor

Class Dot

{

public:

Dot () { cout <<"Constructor \n"; } // конструктор

~dot () { cout <<"Destructor \n"; } // деструктор

}

void main ()

{

Dot A; // створення об'єкта

}

Результат:

Якщо потрібно проініціалізувати змінні класу, використовується конструктор з параметрами.

{

char name; // ім'я крапки

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

public:

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

void Print ();

}

void Dot:: Print()

{

cout<<”koord point”<<name<<":";

cout<<"\tx="<<x<<"\ty="<<y<<'\n';

}

void main ()

{

Dot A ('A', 3, 4); // неявний виклик конструктора

Dot В= Dot ('В', 3, 4); // явний виклик конструктора

A.Print (); // виклик функції члена класу

}

Тут значення, передане в конструктор при оголошенні об'єкта A, використовується для ініціалізації закритих членів name, x і y цього об'єкта.

Список ініціалізації елементів

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

Constrname (parl, par2): mem1 (parl), mem2 (par2), … { …}

{

char name;

double x, y;

public:

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

• • •

};

Хоча виконання ініціалізації в тілі конструктора або за допомогою списку ініціалізації – справа смаку програміста, список ініціалізації є єдиним методом ініціалізації для:

1. даних-констант

2. посилань

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

C++ визначає два спеціальні види конструкторів: конструктор за замовчуванням і конструктор копіювання.

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

Конструктором за замовчуванням є конструктор, використовуваний для побудови об'єкта, коли явні значення для ініціалізації відсутні. Для класу Point це

Point PP;

Тоді конструктор за замовчуванням виглядає так:

Point(){}

Другий варіант завдання конструктора за замовчуванням – це завдання значень за замовчуванням для всіх параметрів.

Point(char Nam=’A', int X=0,int Y=0){name=Nam;x=X;y=Y;}

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

Point pp1(‘B'); -використовується другий конструктор

Point pp1; використовується або перший або другий з усіма параметрами за замовчуванням.

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

При явному виклику конструктора за замовчуванням дужки не ставляться.

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

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

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

Посилання передається щораз, коли новий об'єкт ініціалізуються значеннями існуючого об'єкта. Якщо ви не передбачили конструктор копіювання, компілятор генерує конструктор копіювання за замовчуванням.

В C++ розрізняють поверхневе й глибинне копіювання даних.

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

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

1. включати у визначення класу конструктор копіювання, який буде здійснювати глибинне копіювання

2. клас повинен містити конструктор копіювання, якщо він перевантажує оператор присвоювання.

Якщо в класі не визначений конструктор копіювання, компілятор намагається згенерувати, якщо потрібно, власний конструктор копіювання.




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


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


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



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




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