Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція №3 Функції-члени класу.doc
Скачиваний:
2
Добавлен:
10.11.2019
Размер:
95.23 Кб
Скачать

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

Конструктором за замовчуванням є конструктор, використовуваний для побудови об'єкта, коли явні значення для ініціалізації відсутні. Для класу 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. клас повинен містити конструктор копіювання, якщо він перевантажує оператор присвоювання.

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

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 ; },

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