cpp

Создание класса и экземпляра класса

Класс объявляется с помощью ключевого слова class по следующей схеме:

class [<Название класса>] {
   <Объявления закрытых членов класса>
public:
   <Объявления общедоступных членов класса>
private:
   <Объявления закрытых членов класса>
protected:
   <Объявления защищенных членов класса>
} [<Объявления переменных через запятую>];

После ключевого слова class задается название класса, которое становится новым типом данных. Название класса должно быть допустимым идентификатором, к которому предъявляются такие же требования как и к названиям переменных. Допустимо не задавать название класса, если после закрывающей фигурной скобки указано объявление переменной. Точка с запятой в конце объявления класса является обязательной.

Внутри фигурных скобок располагаются объявления членов класса: полей и методов. Перед объявлениями можно указать название модификатора доступа:

  • public — открытый (общедоступный). Идентификатор доступен для внешнего использования;
  • private — закрытый. Идентификатор доступен только внутри данного класса. Чаще всего поля класса объявляются как закрытые;
  • protected — защищенный. Идентификатор недоступен для внешнего использования, но доступен для данного класса и для потомков этого класса.
Обратите внимание

Модификаторы доступа предназначены для контроля значения полей класса, а также для запрещения использования методов, которые предназначены только для внутренней реализации класса. Например, если в поле предполагается хранение определенных значений, то перед присвоением значения мы можем проверить соответствие значения некоторому условию внутри общедоступного метода. Если же любой пользователь будет иметь возможность ввести что угодно, минуя нашу проверку, то ни о каком контроле не может быть и речи. Такая концепция сокрытия данных называется инкапсуляцией.

Объявление класса только описывает новый тип данных, а не определяет переменную, поэтому память под нее не выделяется. Чтобы объявить переменную, ее название указывается после закрывающей фигурной скобки при объявлении класса или отдельно, используя название класса в качестве типа данных:

<Название класса> <Название переменной>;

Пример одновременного объявления класса с общедоступными полями и переменной:

class Point {
public:
   int x;
   int y;
} point1;

Пример отдельного объявления переменной:

Point point2;

Обратите внимание на наличие модификатора public. Если этот модификатор не указан, то получить доступ к полям x и y будет нельзя, так как по умолчанию члены класса являются закрытыми и доступны только внутри класса. Действие модификатора длится до следующего модификатора или до закрывающей фигурной скобки. В объявлении класса может быть несколько одинаковых модификаторов. Пример:

class Point {
public:
   int x;
public:
   int y;
} point1;

Классы можно вкладывать внутрь функции или другого класса при условии, что все методы имеют реализацию внутри класса. В этом случае класс виден только внутри функции. Пример:

void func() {
   class Point {
   public:
      int x;
      int y;
   } point;
   point.x = 10;
   point.y = 40;
   std::cout << point.x << std::endl; // 10
   std::cout << point.y << std::endl; // 40
}

Внутри одного класса допускается использование объектов другого класса. В качестве примера объявим класс Point (точка), а затем используем его для описания координат прямоугольника внутри класса Rectangle (прямоугольник) (листинг 13.1).

Листинг 13.1. Пример использования классов

#include <iostream>

class Point {
public:
   int x;
   int y;
};
class Rectangle {
public:
   Point top_left;
   Point bottom_right;
};

int main() {
   Rectangle rect;
   rect.top_left.x = 0;
   rect.top_left.y = 0;
   rect.bottom_right.x = 100;
   rect.bottom_right.y = 100;
   std::cout << rect.top_left.x << " "
             << rect.top_left.y << std::endl
             << rect.bottom_right.x << " "
             << rect.bottom_right.y << std::endl;
   return 0;
}

Как видно из примера, для обращения к полям класса Point необходимо вначале получить доступ к полям класса Rectangle, а затем уже с помощью точечной нотации можно изменить и значение поля класса Point:

rect.top_left.x = 0;

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Реквизиты

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp