Понятие класса
В языке C++ активно используются классы, что они из себя представляют:
Как уже было сказано ранее – существует понятие структуры (обособление данных), так вот класс – своего рода продолжение структуры, в котором помимо данных существуют методы(функции для работы с этими данными).
Примечание: В языке C++ понятия структуры и класса имеют незначительные различия т.к. структуры могут работать с методами(функциями), но изначально классы создавались для работы с методами, а структуры (со времен чистого C) такой возможности не имели.
Собственно «обособление данных и методов работы с ними» и возможность скрыть реализацию от пользователя – есть суть инкапсуляции.
Также у классов есть возможность передавать все или часть своих свойств другим классам (там называемым классам-наследникам) данное свойство называется наследование.
Ну и разумеется у классов существует возможность переопределения методов, что позволяет использовать классы с одинаковым интерфейсом, не имея информации о типе и внутренней структуре – это полиморфизм.
Последнее объяснение несколько туманно – постараюсь объяснить на примере:
У нас есть класс родитель c_A с каким-то методом PrintInfo();
мы создаем некий класс потомок/наследник c_B и в нем изменяем функцию PrintInfo();
После где-нибудь в программе мы можем создать оба этих класса (c_A и c_B) и функцию. которая принимает аргумент – переменную типа класс A и вызывает функцию PrintInfo();
getInfoAbout(A cl_A)
{
cl_A. PrintInfo();
}
Если мы в эту функцию передадим объект класса A, то все логично, getInfoAbout(c_A); вызовет функцию PrintInfo(); из класса c_A.
Но если мы передадим объект класса B (наследник, в котором переопределили метод PrintInfo();) то getInfoAbout(c_B); также выполнит свою работу, и вызовут внутри функцию PrintInfo(); из класса- наследника c_B.
Думаю объяснение все равно достаточно туманное, но пока не придумал как объяснить лучше…
думаю впоследствии при подробном обсуждении темы и на примерах будет более понятно.
Постараюсь объяснить терминологию:
Класс – своего рода шаблон, по которому создаются переменные – экземпляры/объекты этого класса.
Внутри класса есть поля класса – обычные, простые переменные типа int, long… массивы, указатели (в т.ч. в динамической памяти), могут быть другие классы и структуры.
>>Для обращения к полям класса внутри класса можно использовать ключевое this->
Также у класса есть методы – функции, объявленные внутри класса и предназначенные для работы с ним.
Рассмотрим объявление классов в С++ в общем виде:
class /*имя класса*/
{
модификатор доступа:
/* список полей и методов */
};
Модификаторы доступа мы рассмотрим чуть позднее, пока будем использовать public:
В теме «структуры» мы создавали структуру для хранения данных о человеке (возраст и имя) и снаружи писали и вызывали функцию для получения этих данных, перепишем это используя понятие класса.
class Person
{
//модификатор доступа
public:
//Методы класса
void GetInfo()
{
cout<<"Name: "<< this->Name <<" age "<< this->age <<endl; //выводим данные на экран
}
//поля класса
unsigned int age;
string Name;
};
//Создадим объект класса Person и проинициализируем его поля.
Person c_Person1;
c_Person1.age=30;
c_Person1.Name="Vasya";
c_Person1.GetInfo(); //Выведет в консоль Neme: Vasya age 30
Помните, ранее для нескольких экземпляров структуры нам приходилось придумывать и писать 3 раза функции вывода на экран, теперь же мы можем вызвать метод c_Person1.GetInfo(); у требуемого экземпляра класса Person.
Сейчас кажется – какая разница написать пару cout не так и сложно, но представьте, что класс Person имел бы большее число полей, а внутри метода GetInfo(); была бы реализация на несколько десятков/сотен строк кода.
Гораздо удобнее вызывать один метод (+ удобнее исправлять код, т.к. реализация написана лишь в 1 месте.)
Стоит отметить, что число полей класса не ограничено, также как и число методов.