Шаг 77.
Microsoft Visual C++ 2010. Язык С/С++.
Классы в C++. Конструкторы и деструкторы класса. Конструктор класса

    На этом шаге мы рассмотрим назначение и использование конструктора.

    Конструктор класса тоже член класса, но специфический - это метод с таким же именем, что и класс. Такие методы не имеют право возвращать какие-либо значения: если вы написали в конструкторе оператор 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. Результат работы приложения

    Заметим, что у класса может быть много конструкторов. Когда создается класс, то для различных способов инициализации его полей и создаются различные конструкторы. Хотя все они имеют одинаковое имя, совпадающее с именем класса, тем не менее компилятор их различает по наборам параметров и типов.

    На следующем шаге мы рассмотрим деструкторы.




Предыдущий шаг Содержание Следующий шаг