Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

21.6. Використання explicit-конструкторів

Для створення "неконвертованого" конструктора використовується специфікатор explicit.

У мові програмування C++ визначено ключове слово explicit, яке застосовується для оброблення спеціальних ситуацій, наприклад, під час використання конструкторів певних типів. Щоби зрозуміти призначення специфікатора explicit, спочатку розглянемо наведену нижче програму.

Код програми 21.12. Демонстрація механізму використання специфікатора explicit

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class myClass { // Оголошення класового типу

int a;

public:

myClass(int x) { a = x;}

int getAzm() { return a;}

};

int main()

{

myClass A_ob(4);

cout << A_ob.getAzm();

getch(); return 0;

}

У цій програмі конструктор класу myClass приймає один параметр. Звернемо Вашу увагу на те, який оголошено об'єкт A_ob у функції main(). Значення 4, що задається у круглих дужках після імені A_ob, є аргументом, який передається параметру х конструктора myClass(), а параметр х, своєю чергою, використовується для ініціалізації члена а. Саме таким способом ми ініціалізуємо члени класу, як це було показано на початку цього навчального посібника. Проте існує і альтернативний варіант ініціалізації. Наприклад, у процесі виконання такої настанови член класу а також набуде значення 4.

myClass A_ob = 4; // Цей формат ініціалізації автоматично

// перетвориться у формат myClass(4).

Як зазначено у коментарі, цей формат ініціалізації автоматично перетвориться у виклик конструктора класу myClass, а число 4 використано як аргумент. Іншими словами, попередня настанова обробляється компілятором так, як вона була записана:

myClass A_ob(4);

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

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

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class myClass { // Оголошення класового типу

int a;

public:

explicit myClass(int x) { a = x;}

int getAzm() { return a;}

};

Тепер буде дозволено до застосування тільки конструктори, які задаються в такому форматі:

myClass A_ob(110);

Потреба неявного перетворення конструктора

Автоматичне перетворення з типу аргумента конструктора у виклик конструктора саме по собі має цікаві наслідки. Розглянемо, наприклад, такий код програми.

Код програми 21.13. Демонстрація механізму використання неявного перетворення конструктора

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class myClass { // Оголошення класового типу

int num;

public:

myClass(int izm) { num = izm;}

int getNum() { return num;}

};

int main()

{

myClass A_ob(10);

cout << A_ob.getNum() << endl; // Відображає 10

// Тепер використовуємо неявне перетворення для

// присвоєння нового значення.

A_ob = 1000;

cout << A_ob.getNum() << endl; // Відображає 1000

getch(); return 0;

}

Звернемо Вашу увагу на те, що нове значення присвоюється об'єкту A_ob за допомогою такої настанови:

A_ob = 1000;

Використання такого формату можливе завдяки опосередкованому перетворенню з типу int в тип myClass, яке створюється конструктором myClass(). Звичайно ж, якби конструктор myClass() було оголошено за допомогою специфікатора explicit, то попередня настанова не могла б виконатися.