Класс определяет новый тип данных, который задаёт формат объекта. Класс включает в себя как данные, так и функции, предназначенные для работы с этими данными (выполнения операций). В C++ спецификация класса используется для построения объектов. Объекты – это экземпляры класса. Важно понимать, что класс – это логическая абстракция (новый тип данных), которая реально не существует до тех пор, пока не будет создан объект этого класса, — экземпляр класса, — то есть то, что станет физическим представлением этого класса в памяти компьютера.
Классы как новый тип данных имеют следующие характерные элементы:
Объявление класса
Объявление класса синтаксически подобно объявлению структуры и осуществляется с помощью ключевого слова class:
class <имя класса>: <спецификатор доступа> <имя класса-родителя>, …
{
<объявление закрытых данных и функций>
<спецификатор доступа>:
<объявление данных и функций>
<спецификатор доступа>:
<объявление данных и функций>
<спецификатор доступа>:
<объявление данных и функций>
…
};
Спецификаторы доступа
В качестве <спецификатора доступа> в объявлении класса используется одно из трёх ключевых слов языка C++:
public – открытые;
private
– закрытые;
protected – защищённые.
По умолчанию функции и данные, объявленные внутри класса, считаются закрытыми (private) и доступны лишь функциям-членам этого класса. Спецификатор public открывает доступ к функциям и данным класса из других частей программы вне этого класса. Спецификатор protected открывает доступ к членам класса (данным и функциям) лишь членам этого класса и функциям-членам классов-наследников; вне этих классов члены класса, объявленные как protected, недоступны. Зона влияния спецификатора доступа в объявлении класса простирается до следующего спецификатора доступа или до конца объявления класса. Внутри объявления класса спецификаторы доступа можно чередовать в произвольном порядке.
Конструкторы
Классы в C++ имеют специальную функцию, которая называется конструктор класса.
Конструктор (англ. constructor) – это функция, которая автоматически вызывается при создании экземпляра класса.
Конструктор используется для инициализации переменных-членов класса, выделения необходимой памяти и выполнения других действия, необходимых перед началом использования класса. Класс может иметь несколько конструкторов, это стало возможным наряду с перегрузкой функций. Имя конструктора должно совпадать с именем класса. Например:
class SomeObject
{
public:
SomeObject();
<другие функции и данные>
…
};
SomeObject::SomeObject()
{
<необходимые действия>
}
Оператор разрешения области видимости “::” квалифицирует имя члена вместе с именем его класса. Для конструктора не указан тип возвращаемого значения поскольку конструктор не может возвращать никакого значения. Невозможно также явно вызвать конструктор – он вызывается в момент создания объекта как экземпляра класса.
Например, пусть класс SomeObject имеет два конструктора:
// Объявление класса SomeObject
class SomeObject
{
public:
SomeObject(); // первый конструктор – конструктор по умолчанию
SomeObject(int); // второй конструктор – конструктор с параметром
int iIterator; // переменная-член класса типа int
…
};
// Первый конструктор – конструктор по умолчанию
SomeObject::SomeObject()
{
iIterator = 0;
}
// Второй конструктор – конструктор с параметром
SomeObject::SomeObject(int aIter)
{
iIterator = aIter;
}
Пример создания экземпляра класса SomeObject с вызовом конструктора по умолчанию:
SomeObject& myObject = *new SomeObject;
Пример создания экземпляра класса SomeObject с вызовом конструктора с параметром (второго конструктора):
SomeObject* ptrObject = new SomeObject(5);
(В первом примере адрес созданного объекта-экземпляра класса SomeObject хранит ссылка, а во втором – указатель.)
Списки инициализаторов
Данные-члены класса можно инициализировать при помощи списка инициализаторов (англ. initializer list), а не в теле конструктора. Например:
class Rect
{
public:
Rect();
Rect(int aLeft, int aTop, int aBottom, int aRight);
…
private:
int left;
int top;
int bottom;
int right;
};
// Первый конструктор – конструктор по умолчанию
Rect::Rect() : left(0), top(0), bottom(0), right(0)
{
}
// Второй конструктор – конструктор с параметром
Rect::Rect(int aLeft, int aTop, int aBottom, int aRight) : left(aLeft), top(aTop), bottom(aBottom), right(aRight)
{
}
Синтаксические правила у списка инициализаторов такие:
Особый случай – инициализация ссылок-членов класса: их можно инициализировать только в списке инициализаторов, в теле конструктора это сделать нельзя! Например:
class SomeObject
{
public:
SomeObject();
…
private:
OtherObject& other;
…
};
// конструктор
SomeObject::SomeObject() : other(*new OtherObject)
{
}
См. также:
Конспект по С++: динамическое распределение памяти
©Задорожный Сергей Михайлович, 2019г.