Конструкторы
Часто во время создания объекта его элементам необходимо присвоить начальные значения. Сделать это непосредственно в определении класса нельзя, например, следующее описание приведет к ошибке компиляции:
class СWorld
{
unsigned long objectsn=0, // ошибка
time = 0; // ошибка
};
Рисунок 4
Оставлять переменные класса непроинициализированными крайне нежелательно, так как в этом случае может возникнуть ситуация некорректной работы программы.
Избежать подобной ситуации можно, например, написав функцию, которая будет присваивать нулевые значения элементам objectsn и time, и вызывать эту функцию каждый раз сразу после объявления объекта. Но в языке С++ есть такой механизм как конструкторы. Конструктор (construct - создавать) - это специальная функция-член класса с тем же именем, что и класс.
class СWorld
{
public:
CWorld(); // конструктор класса CWorld
};
CWorld::CWorld()
{
time = 0;
objectsn = 0;
}
Рисунок 5- Пример конструктора класса CWorld
Конструктор хотя и является методом класса, для него не определяется тип возвращаемого значения. Отсюда вытекает недопустимость использования в конструкторе оператора return. Конструктор автоматически вызывается при создании объекта, т.е не нужно специально вызывать его - это сделает компилятор.
Конструктор без параметров называют конструктором по умолчанию. Такой конструктор обычно присваивает переменным-членам класса наиболее часто используемые значения. В описанном выше примере класса CWorld используется конструктор по умолчанию. В нем переменным time и objectsn присваиваются нулевые значения. Таким образом, после создания экземляра объекта типа CWorld, он будет содержать допустимые значения, а не "мусор".
Если для класса не определено никакого конструктора, компилятор создает конструктор по умолчанию. Такой конструктор не задает никаких начальных значений. Поэтому, если необходимо, чтобы перед использованием объекта данным-членам класса были присвоены начальные значения, необходимо определить собственный конструктор.
Если класс имеет конструктор по умолчанию (определенный программистом или созданный компилятором), можно определить объект класса без передачи параметров, например :
CWorld world;
Рисунок 6- Пример определения объекта класса CWorld без передачи параметров
Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
Следующая команда, например, не создает объект типа my_Time, с вызовом конструктора по умолчанию а является определением функции world, которая не принимает параметров и возвращает объект типа CWorld,
CWorld world();
Рисунок 7- Пример определения объекта класса CWorld с вызовом конструктора по умолчанию
Для каждого класса может существовать только один конструктор по умолчанию.
Существует возможность создания конструкторов с параметрами, предназначенными для инициализации полей класса. Конструкторов с разным списком параметров у одного класса может быть множество.
class CObject
{
float x;
float y;
CObject(float a, float b);
};
СObject::CObject(a,b)
{
x = a;
y = b;
}
Рисунок 8- Пример определения для класса CWorld конструктора с параметрами