На этом шаге мы рассмотрим назначение и использование конструктора.
Конструктор класса тоже член класса, но специфический - это метод с таким же именем, что и класс. Такие методы не имеют право возвращать какие-либо значения: если вы написали в конструкторе оператор return, компилятор выдаст ошибку. Конструктор выполняет различные задачи и не виден вам как программисту. Даже если вы сами не писали его текст, конструктор по умолчанию всегда присутствует в классе, ибо основная его задача - создавать в памяти экземпляр класса (т. е. как бы по проекту (классу) построить дом (экземпляр класса)). В этом случае конструктор берется из общего прародителя классов - класса Оbject, в котором он имеется.
Вторая задача конструктора - придавать всем членам-данным класса начальные значения. Если вы сами не построили конструктор, который станет инициализировать члены-данные вашего класса вашими же значениями, то этим данным невидимый для вас конструктор (конструктор по умолчанию) придаст свои, принятые в системе для данного типа величин значения (например, данные типа int получат нулевые значения и т. д.). В тексте ниже приведен пример класса с конструктором, созданным для инициализации членов-данных класса теми значениями, которые задаст пользователь класса при работе с ним.
// 77_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> //for printf() #include <conio.h> //for _getch() using namespace System; class Date { private: //Это - члены-данные класса. С ними будут работать //функции-члены класса: get... и set... int month; int day; int year; public: Date( int dy, int mn, int yr )//конструктор класса //члены-данные day, month, year будут принимать значения, //которые поступят в конструктор как в функцию при его //использовании где-нибудь в приложении { day = dy; month = mn; year = yr; } int getMonth() const; //функция getMonth() объявлена с атрибутом const - может //данные только поставлять, не изменяя их (read-only), а //функция setMonth() не имеет квафикатора const и поэтому //данные внутри себя может изменять: виды функций определены //вне класса (см. ниже) void setMonth(int mn); int getDay(); void setDay(int dy); int getYear(); void setYear(int yr); ~Date() { };//Деструктор класса }; //конец описания класса //создание функций (вне класса, поэтому надо указывать имя класса, //для которого эти функции создаются) int Date::getMonth() const { return month; } //функция ничего не изменяет void Date::setMonth(int mn) { month = mn; //Функция изменяет член-данное класса } int Date::getDay() { return Date::day; } void Date::setDay (int dy) { day = dy; } int Date::getYear() { return Date::year; } void Date::setYear(int yr) { Date::year = yr; } // ============================================ void main() //Работа с созданным классом { //здесь с помощью конструктора в экземпляре класса //(экземпляр с именем MyDate) устанавливаются заданные //пользователем значения: Date MyDate(21,1,2010); int d, m, y; d = MyDate.getDay(); //d=21 m = MyDate.getMonth(); //m=1 y = MyDate.getYear(); //y=2010 printf("d=%d m=%d y=%d\n",d,m,y); Date BirthDate ( 20, 1, 1960 ); //изменить значение месяца на значение 4 в экземпляре MyDate: MyDate.setMonth( 4 ); m = MyDate.getMonth(); //m=4 printf("m=%d\n",m); //изменить значение месяца на значение 5 в экземпляре BirthDate: BirthDate.setMonth( 5 ); m = BirthDate.getMonth(); //m=5 printf("m=%d\n",m); _getch(); }
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
Заметим, что у класса может быть много конструкторов. Когда создается класс, то для различных способов инициализации его полей и создаются различные конструкторы. Хотя все они имеют одинаковое имя, совпадающее с именем класса, тем не менее компилятор их различает по наборам параметров и типов.
На следующем шаге мы рассмотрим деструкторы.