Начиная изучать классы, мы подошли к важному этапу – изучению объектно-ориентированного программирования (ООП) в C++. Классы – довольно обширная тема. Поэтому я разобью её на несколько частей. Таким образом, начинающим будет достаточно просто освоить информацию и разобраться с основами этой темы.
В данном уроке мы познакомимся с синтаксисом классов C++, со спецификаторами доступа к членам (полям) класса (private и public). Узнаем, что такое методы класса и как обращаться к членам класса из программы.
Классы C++ похожи на структуры, но обладают своими особенностями и преимуществами. До этого в программах мы определяли структуры и функции отдельно. В классах они объединены в одно целое, чтобы к закрытым данным класса могли обращаться только функции этого класса. Мне понравилась иллюстрация из книги Объектно-ориентированное программирование в С++” Р. Лафоре
В наших первых уроках об ООП мы будем рассматривать простые для понимания классы. Сложные примеры будут только отвлекать от важных деталей, которые касаются определения классов и объектов. В заключительном уроке о классах мы подытожим все изученное и ответим на вопросы – зачем нужны классы и в чём заключаются основные принципы ООП.
Сейчас напишем и разберём следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #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. В С++ принято защищать некоторые данные класса от внешнего вмешательства. То есть, чтобы из главной функции, например, никто не мог напрямую обратиться к этим данным через объект и внести какие-либо изменения.
Чтобы сделать данные “закрытыми” надо разместить их в поле private . По умолчанию, всё что объявлено в классе, становится закрытым от прямого доступа и доступно только для других членов или методов класса. Так что, если такие данные объявляются в самом верху тела класса, слово private можно не использовать.
Чтобы объявить открытые члены класса, надо применить ключевое слово public. В этом поле зачастую находятся методы класса, которые и будут работать с приватными (закрытыми) данными. Публичные (открытые) методы и другие члены класса доступны из любой другой части кода/программы, в которой определен класс. Иногда для работы вам возможно понадобится объявить публичный член класса или приватный метод.
Обратите внимание на определение методов класса. Мы не передаем в них параметры. При этом вносим изменение в переменную number и показываем её на экран. Дело в том, что члены и методы класса находятся в одной области видимости. И методы класса свободно обращаются к данным-членам класса.
В нашем коде мы разместили определение методов прямо в теле класса, так как определение занимает очень мало места. Но чаще придётся выносить его за пределы тела класса или даже в другой файл, а в самом классе оставлять только прототипы методов. Посмотрите, как выглядит определение методов вне класса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #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-функциями (встроенными функциями) в отличии от методов, определённых вне класса.
Так как класс – это некий тип, определённый программистом, то создав класс мы можем создавать объекты этого типа: Number object; Как мы обсудили раньше, мы не сможем обратиться к приватным членам класса из главной функции. Но мы легко можем с ними работать, через определённые методы класса. Так вызываем эти методы через объект и сначала присваиваем переменной number значение, а затем показываем на экран.
Для первого вводного урока, информации будет достаточно. Следующий урок будет содержать задачи на классы, для того, чтобы вы могли закрепить полученные знания. Задание для вас – до перехода к решению задач, посмотреть видео-урок.
Где-то (или здесь в описаниях классов, или раньше, в описаниях структур) нужно бы сказать, что структуры, доставшиеся C++ в наследство от C, и классы – это одно и то же.
Только по умолчанию для всех членов структуры область видимости определена как public, а в классах – как private. Поэтому мы в классах всегда переопределяем видимость каких-то членв (public, protected) – снизу вверх, от меньшего (private) к большему (public, protected). А в структурах в этом просто не возникает необходимость – сверху вниз.
Но структуры C++, в отличие от структур C, из-за такой дуальности (с классами) могут также иметь свои собственные функции-методы.
на видео уроке, может кому -то будет полезно , не все компиляторы умные , как у Дениса Маркова. У меня например нужно было добавлять указатель this-> чтоб аварийной ситуации не было . Еще очень мало задач по темам, у вас в начале так хорошо все было, получил информацию-получи и задачу по ней: а сейчас выучи и пойми куча информации(не легкой)а потом уже переходи к задаче.
#include
#include
using namespace std;
typedef unsigned int ui;
class accaunt
{
private:
char *ID;
char*Name;
ui balance;
public:
accaunt(void);
void setid(char*);
char * getid();
void setname(char*);
char* getname();
~accaunt(void);
ui getbalance();
void setbalance(ui);
};
accaunt::accaunt()
{
}
accaunt::~accaunt()
{
}
void accaunt::setid(char*id)
{
this->ID = id;
};
char * accaunt::getid()
{
return ID;
}
void accaunt::setname(char*Name)
{
this->Name = Name;
}
char * accaunt::getname()
{
return Name;
}
ui accaunt::getbalance()
{
return balance;
}
void accaunt::setbalance(ui b)
{
this->balance = b;
}
int main()
{
setlocale(LC_ALL, “rus”);
accaunt a;
a.setbalance(123);
a.setid(“444”);
a.setname(“Де”);
cout << a.getbalance() << endl;
cout << a.getname() << endl;
cout << a.getid() << endl;
cin.get();
return 0;
}
7f835p