Классы являются центральной возможностью в языке D, поддерживающей объектно-ориентированное программирование, и они часто называются пользовательскими типами.
Класс используется для указания формы объекта и сочетает в себе представление данных и методы для управления этими данными в один аккуратный пакет. Данные и функции внутри класса называются членами класса.
Когда вы определяете класс, вы определяете схему для типа данных. В нём нет фактического определения каких-либо данных, но есть определение того, что означает имя класса, то есть то, что будет представлять собой объект класса и какие операции можно выполнять с таким объектом.
Определение класса начинается с ключевого слова class, за которым следует имя класса; затем идёт тело класса, заключённое в пару фигурных скобок. Определение класса не должно завершаться ни точкой с запятой, ни списком объявлений. Например, мы определили тип данных Box (коробка) с использованием ключевого слова class следующим образом:
class Box { public: double length; // Длина коробки double breadth; // Ширина коробки double height; // Высота коробки }
Ключевое слово public определяет атрибут доступа для членов класса, которые следуют за ним. Доступ к публичному члену можно получить извне класса в пределах области видимости объекта класса. Вы также можете установить для членов класса атрибуты private или protected, которые мы обсудим в подразделе Инкапсуляция.
Класс предоставляет собой прототип для объектов, поэтому по-существу объект создается из класса. Вы объявляете объекты класса точно таким же образом, как вы объявляете переменные базовых типов. Следующие утверждения объявляют два объекта класса Box:
Box box1; // Объявить box1 типа Box Box box2; // Объявить box2 типа Box
Оба объекта box1 и box2 имеют собственные копии данных-членов.
К сожалению, здесь авторы учебника не совсем правы. Такое объявление подходит для объектов структур,
а для объектов классов память не будет распределена, и будет вызвана ошибка времени выполнения при попытке доступа к членам класса.
Объекты классов надо создавать из кучи с помощью оператора new:
Box box1 = new Box(); // Объявить и создать box1 типа Box
Box box2 = new Box(); // Объявить и создать box2 типа Box
– прим. пер.
Доступ к публичным членам данных объекта класса осуществляется с помощью оператора прямого доступа (.). Давайте попробуем следующий пример, чтобы всё было ясно:
import std.stdio; class Box { public: double length; // Длина коробки double breadth; // Ширина коробки double height; // Высота коробки } void main() { Box box1 = new Box(); // Объявить и создать box1 типа Box Box box2 = new Box(); // Объявить и создать box2 типа Box double volume = 0.0; // Здесь сохраняем объём коробки. // спецификация коробки 1 box1.height = 5.0; box1.length = 6.0; box1.breadth = 7.0; // спецификация коробки 1 box2.height = 10.0; box2.length = 12.0; box2.breadth = 13.0; // объём коробки 1 volume = box1.height * box1.length * box1.breadth; writeln("Объём коробки 1 : ",volume); // объём коробки 2 volume = box2.height * box2.length * box2.breadth; writeln("Объём коробки 2 : ", volume); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Объём коробки 1 : 210 Объём коробки 2 : 1560
Важно отметить, что доступ к закрытым и защищённым членам невозможен напрямую, с использованием оператора прямого доступа к члену (.). Вскоре вы узнаете, как можно получить доступ к закрытым и защищённым членам.
К настоящему моменту у вас есть базовое представление о классах и объектах в D. Существуют и другие интересные понятия, связанные с классами и объектами, которые мы обсудим в следующих подразделах, перечисленных ниже:
№ п/п | Понятие и описание |
---|---|
1 | Функции-члены класса
Функция-член класса – это функция, у которой определение её или её прототипа находится в определении класса, как и для любой другой переменной. |
2 | Модификаторы доступа класса
Член класса может быть определён как public (открытый), private (закрытый) или protected (защищенный). По умолчанию члены будут считаться закрытыми. |
3 | Конструкторы и деструкторы
Конструктор класса является специальной функцией в классе, которая вызывается при создании нового объекта класса. Деструктор также является специальной функцией, которая вызывается при удалении созданного объекта. |
4 | Указатель this в D
Каждый объект имеет специальный указатель с именем this, который указывает на сам этот объект. |
5 | Указатели на классы в D
Указатель на класс делается точно так же, как указатель на структуру. |
6 | Статические члены класса
Как данные-члены, так и функции-члены класса могут быть объявлены как статические. |