Классы

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

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

В наших первых уроках об ООП мы будем рассматривать простые для понимания классы. Сложные примеры будут только отвлекать от важных деталей, которые касаются определения классов и объектов. В заключительном уроке о классах мы подытожим все изученное и ответим на вопросы — зачем нужны классы и в чём заключаются основные принципы ООП.

Сейчас напишем и разберём следующий код:

#include <iostream>

using namespace std;

 

class Number

{

private:

int number;

public:

void setNumber()

{

cout << "Введите число: ";

cin >> number;

}

void getNumber()

{

cout << number << endl;

}

};

 

int main()

{

setlocale(LC_ALL, "rus");

 

Number object;

 

object.setNumber();

object.getNumber();

return 0;

}

В строках 4 — 19 находится определение класса. Чтобы объявить класс надо использовать ключевое слово class и дать ему имя. В фигурных скобках описать его и, в конце поставить ; точку с запятой.

После объявления имени класса, оно становится именем нового типа данных. С этим типом будут создаваться объекты класса.

В теле класса (между фигурными скобками) могут находиться данные (переменные базовых типов и строки ), функции, принадлежащие классу, структуры, классы… Всё это чаще называют членами или полями класса. Функции, которые объявлены и/или определены в теле класса — это методы класса. Далее так их и будем называть. Просто надо запомнить: методы класса — это функции, специально созданные для работы с данными (членами) этого класса.

Рассмотрим новые для вас ключевые слова — private и public. В С++ принято защищать некоторые данные класса от внешнего вмешательства. То есть, чтобы из главной функции, например, никто не мог напрямую обратиться к этим данным через объект и внести какие-либо изменения.

Попытка обращения к закрытому члену класса из main-функции

Чтобы сделать данные «закрытыми» надо разместить их в поле private . По умолчанию, всё что объявлено в классе, становится закрытым от прямого доступа и доступно только для других членов или методов класса. Так что, если такие данные объявляются в самом верху тела класса, слово private можно не использовать. Чтобы объявить открытые члены класса, надо применить ключевое слово public. В этом поле зачастую находятся методы класса, которые и будут работать с приватными (закрытыми) данными. Публичные (открытые) методы и другие члены класса доступны из любой другой части кода/программы, в которой определен класс. Иногда для работы вам возможно понадобится объявить публичный член класса или приватный метод.

Обратите внимание на определение методов класса. Мы не передаем в них параметры. При этом вносим изменение в переменную number и показываем её на экран. Дело в том, что члены и методы класса находятся в одной области видимости. И методы класса свободно обращаются к данным-членам класса.

В нашем коде мы разместили определение методов прямо в теле класса, так как определение занимает очень мало места. Но чаще придётся выносить его за пределы тела класса или даже в другой файл, а в самом классе оставлять только прототипы методов. Посмотрите, как выглядит определение методов вне класса:

#include <iostream>

using namespace std;

 

class Number

{

private:

int number;

public:

void setNumber(); //прототипы

void getNumber();

};

//~~~~~~~~~~~~~~~~~~~~~~~~~

void Number::setNumber()

{

cout << "Введите чиcло: ";

cin >> number;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~

void Number::getNumber()

{

cout << number << endl;

}

 

int main()

{

setlocale(LC_ALL, "rus");

 

Number object;

 

object.setNumber();

object.getNumber();

return 0;

}

Чтобы указать, что функция, определенная вне класса, является именно его методом, надо как-то связать имя класса с именем этого метода. Для этого пишем сначала тип возвращаемого значения, затем имя класса, далее операцию расширения области видимости :: (двойное двоеточие), имя метода и скобки (с параметрами или без): void Number::setNumber() Потом, как обычно, следует определение тела функции в фигурных скобках.

Методы, определённые в классе, по умолчанию являются inline-функциями (встроенными функциями) в отличии от методов, определённых вне класса.

Так как класс — это некий тип, определённый программистом, то создав класс мы можем создавать объекты этого типа: Numberobject; Как мы обсудили раньше, мы не сможем обратиться к приватным членам класса из главной функции. Но мы легко можем с ними работать, через определённые методы класса. Так вызываем эти методы через объект и сначала присваиваем переменной number значение, а затем показываем на экран.