Конспект по С++: классы и объектно-ориентированное программирование, объявление класса, спецификаторы доступа, конструкторы, списки инициализаторов

Суббота , 2, Ноябрь 2019 Leave a comment

Класс определяет новый тип данных, который задаёт формат объекта. Класс включает в себя как данные, так и функции, предназначенные для работы с этими данными (выполнения операций). В C++ спецификация класса используется для построения объектов. Объекты – это экземпляры класса. Важно понимать, что класс – это логическая абстракция (новый тип данных), которая реально не существует до тех пор, пока не будет создан объект этого класса, — экземпляр класса, — то есть то, что станет физическим представлением этого класса в памяти компьютера.

Классы как новый тип данных имеют следующие характерные элементы:

  • контроль доступа (private, public, protected);
  • конструкторы;
  • деструктор;
  • члены-данные;
  • функции-члены;
  • специальный скрытый указатель this.

     Объявление класса

Объявление класса синтаксически подобно объявлению структуры и осуществляется с помощью ключевого слова 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г.