у статті Конструктор і деструктор класу ми вже зустрічалися з перевантаженим конструктором в коді, але не акцентували на цьому увагу. Перевантаження конструкторів дуже схожа з перевантаженням функцій. Конструкторів в обумовленому класі може бути кілька – по мірі необхідності. Вони повинні мати однакове ім'я, ідентичне імені класу і обов'язково повинні відрізнятися сигнатурою.
Наприклад: один з конструкторів не приймає параметри, другий приймає два параметри, третій приймає три параметри. пізніше, під час створення об'єкта, параметри передаються в якості аргументів. Так компілятор зможе визначити, який з оголошених конструкторів застосувати при створенні об'єкта.
Рассмотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <iostream> using namespace std; class _2Data { double data1; double data2; public: _2Data(); _2Data(double initData1, double initData2); void showData(); }; // конструктор класса _2Data с параметрами _2Data::_2Data(double initData1, double initData2) { data1 = initData1; data2 = initData2; cout << "\nСработал конструктор с параметрами.\n"; } // конструктор класса _2Data без параметров _2Data::_2Data() { data1 = 0; data2 = 0; cout << "\nСработал конструктор без параметров.\n"; } void _2Data::showData() // метод вывода на экран { cout << "data1 = " << data1 << endl; cout << "data2 = " << data2 << endl << endl; } int main() { setlocale(LC_ALL, "rus"); // создается объект Obj1 и вызывается конструктор // без параметров. Поля класса инициализируются 0-ми // на экран выводится "Сработал конструктор без параметров." _2Data Obj1; Obj1.showData(); // показываем данные // создается объект Obj2, вызывается конструктор c параметрами // поля класса инициализируются значениями (переданными аргументами) // на экран выводится "Сработал конструктор с параметрами." _2Data Obj2(222, 333); Obj2.showData(); // смотрим значения } |
На цьому прикладі досить легко побачити, чим викликана необхідність перевантаження конструкторів. Основний сенс в тому, щоб дати можливість програмісту вибрати найбільш підходящий спосіб ініціалізації об'єкта.
Тут представлений найпоширеніший варіант перевантаження конструкторів. А саме конструктор з параметрами і другий без параметрів. часто, програмісту бувають необхідні обидва подібних конструктора, так як конструктор з параметрами зручно використовувати, працюючи з поодинокими об'єктами. Але він не може бути використаний, например, для ініціалізації динамічного масиву об'єктів класу.
При кожному оголошенні об'єкта класу треба застосовувати відповідний певним конструкторам спосіб оголошення.
Конструктор можна перевантажувати стільки раз, скільки вважаєте за потрібне. Але, як буває у більшості випадків, бажано дотримуватися золотої середини. Перевантажуйте його тільки для найбільш поширених ситуацій.
хочеться додати, що деструкція, на відміну від конструктора, перевантажений бути не може, так як він ніяких параметрів не приймає.
Тут добре б додати:
– якщо ви описуєте клас без опису конструктора взагалі, то для класу створюється конструктор за замовчуванням без параметрів;
– але як тільки ви додаєте хоча б один конструктор, замовчуваний конструктор без параметрів чи не створюється (це може потім спантеличити при створенні об'єктів);
– якщо ж все-таки потрібен і конструктор без параметрів, в тому числі, то його потрібно описати явно.
І ще…
Часто замість опису декількох конструкторів зручно створити один конструктор, але з декількома параметрами, певними з замовчує значеннями:
class my {
my( int first = 0, float second = 1.0, char *title = "object" ) {
// ...
}
}
...
my m1(), m2( 3 ), m3( 4, -5.5 ), m4( 5, 1.0, "new_object" );
Свого часу збивало з пантелику слово “перевантажений”-навіщо його перевантажують, чому так не люблять? Потім пояснив собі, що це перезавантажених.