Знакомство с классами всегда происходит сложно у большого числа студентов.
В стандарте C++ под классом (class) подразумевается пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union.
Под структурой (structure) подразумевается класс, определённый через ключевое слово struct; под объединением определённый через ключевое слово (union).
Для знакомства с классами я решил использовать обычное сложение двух чисел типа int.
Если я не ошибаюсь, самый распространённый пример, даваемый для ознакомления — демонстрация работы на основе геометрических фигур. Но на мой взгляд (сугубо личное мнение) задействование геометрических фигур никакой конкретики новичку не даёт.
Задача: Сложить два числа через классы в C++
Шаг первый: пишем пустую программу.
C++
1
2
3
4
5
6
//Код С++. Пустая программа Borland C++ 3.1
#include <iostream.h>
intmain(){
}
Шаг второй: объявляем класс.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//Код С++. Объявление класса Borland C++ 3.1
#include <conio.h>
#include <iostream.h>
classsumma//Объявили класс summa (Тут не нужны скобки).
{
};//Обратите внимание на точку с запятой
intmain()
{
}
Шаг третий: подгатавливаем класс, описывая внутри заявленного класса всё нужное для его работы.
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
//Код С++. Подготовка класса Borland C++ 3.1
#include <conio.h>
#include <iostream.h>
classsumma//Объявили класс summa (Тут не нужны скобки).
{
intx,y;// по умолчанию private
public://После слова public ставим двоеточие
voidget_xy()//Функция доступна из любого места программы. Вводим через функцию 2 числа
{
cout<<"Wwedi X: ";
cin>>x;//Ввели X
cout<<"Wwedi Y: ";
cin>>y;//Ввели Y
}
intsum_xy()//Функция суммирования двух чисел
{
returnx+y;//X,Y берутся из класса
}
};//Обратите внимание на точку с запятой
intmain()
{
}
Шаг четвёртый: работа с классом.
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
//Код С++. Работа с классом Borland C++ 3.1
#include <conio.h>
#include <iostream.h>
classsumma//Объявили класс summa (Тут не нужны скобки).
{
intx,y;// по умолчанию private
public://После слова public ставим двоеточие
voidget_xy()//Функция доступна из любого места программы. Вводим через функцию 2 числа
{
cout<<"Wwedi X: ";
cin>>x;//Ввели X
cout<<"Wwedi Y: ";
cin>>y;//Ввели Y
}
intsum_xy()//Функция суммирования двух чисел
{
returnx+y;//X,Y берутся из класса.
}
}s1;//Обратите внимание на точку с запятой. s1 - это объект класса summa.
intmain()
{
s1.get_xy();//Обращаемся к объекту класса и через него вызываем функцию ввода данных
cout<<s1.sum_xy();//Обращаемся к объекту класса и через него вызываем функцию, в которой суммировали X+Y
}
Теперь я подробнее расскажу про важные моменты в этом коде.
Что такое класс и зачем он вообще нужен?
В первую очередь класс является собственным типом данных.
Класс — это некоторая идея еще не существующего объекта, в которой воедино собраны все детали, все свойства и все нужные действия, необходимые для будущего объекта.
Проведу небольшую аналогию с типами данных. Когда вы объявляете нужные вам переменные, есть момент, где вы их задаёте, прописывая их тип, но ещё не написав названия переменных. Несмотря на отсутствие названий переменных, вами непосредственно объекты указанного типа уже задуманы.
C++
1
2
3
4
intmain()
{
int//Вы еще не прописали название переменной, но она задумана и тип уже прописан
}
Создается класс с помощью слова class, за которым следует открывающаяся и закрывающаяся фигурные скобки. После закрывающейся фигурной скобки обязательно ставится точка с запятой. Внутри фигурных скобок пишется вся информация для класса. Создание пустого класса продемонстрировано на втором шаге.
После создания пустого класса, внутри его ему прописывается вся информация для выполнения поставленной задачи.
Одна из особых сложностей в понимании новичками классаов — использование ключевых слов private, protected и public. В настоящий момент, в момент ознакомления, ключевое слово protected можно опустить: оно имеет смысл при наследовании, эту тему вы будете тзучать потом. Поэтому разберём private и public.
private и public — это ключевые слова, помогающие разделять доступ к внутренностям класса. Называются эти ключевые слова модификаторами доступа.
Что описано под private доступно только внутри класса. То, что описано под public, доступно по всей программе. Чем-то очень похоже на локальные и глобальные переменные.
Модификатор доступа в классе по умолчанию private, поэтому слово private в начале класса писать не обязательно. Ниже показаны две равнозначные записи:
C++
1
2
3
4
5
classsumma
{
private:intx,y,z;
public:inta;
};
C++
1
2
3
4
5
classsumma
{
intx,y,z;
public:inta;
};
Главный вопрос: "Что прописывать в private, а что в public?". Попробую описать.
В private стоит прописывать все детали вашей конструкции, а в public только те функции и те данные, доступ к которым должен как-то происходить из функций вне класса.
На третьем шаге было определено так, что к деталям я отнёс переменные x и y. Поскольку они детали механизма моего будущего объекта, то доступа им на всю программу я не дал, прописав их в секции private (по умолчанию private, поэтому явно не написано). Вместе с этим, мне понадобилось описать две функции: одна обеспечивает ввод чисел, вторая складывает числа. Как ни крути, логично, что доступ к этим функциям мне нужен извне класса, поэтому я сделал обе функции доступными для всей программы. Т. е. из любого места программы я могу вызвать любую из этих функций и или ввести значения в переменные, сокрытые внутри класса, или выполнить расчёт суммы переменных, сокрытых внутри класса.
Так как класс всего-лишь идея, а конечной нашей целью является нечто существующее, основанное на этой идее, идею нужно воплощать в жизнь. Чтобы дать жизнь идее, нужно объявить объект.
Объект — это экземпляр класса.
Если у вас есть класс, но нет объекта, то вы как депутат голословный пустословите и обещаете, но на практике дел не делаете. Чтобы не быть "пустословом" обязательно создать объект, т. к. работать вы будете через этот объект. На четвертом шаге был приведён пример создания объекта.
По сути своей класс есть структура.
Отличается класс от структуры только модификатором доступа по умолчанию. В С++ у структуры по умолчанию public, а у класса private.
Чтобы обратиться к элементу внутри класса, нужно задействовать название объекта, воплотившего класс, и через точку написать название элемента, к которому обращаемся. Свободный доступ такого вида из вне класса возможен только для элементов класса, написанных в секции public.
На четвёртом шаге произошло обращение к функции, находящейся внутри класса, к функции summa. Обращение произошло через созданный объект. Поскольку две функции, описанные в классе, размещены в секции public, то в любом месте программы всегда можно задействовать объект для их вызова.
Первая функция — ввод данных. При вводе данных я вывожу на экран нужные для ясности диалоговые сообщения и считываю с клавиатуры нужные числа. Введённые числа запоминаются в переменные x и y, объявленные внутри класса. Напоминаю, что непосредственного доступа к этим x и y из программы у меня нет. Функция, описанная внутри класса и задействованная, выступает в роли посредника.
Вторая функция — сложение двух чисел. Вы прекрасно видите, что никаких аргументов в функцию я не передавал. Внутри класса я использовал переменные x и y, просто использовав названия воспроизвёл сложение.
Во время ввода данных введённые значения присвоились в переменные x и y, сокрытые классом. После этого присвоения любые функции того же класса могут свободно работать с переменными, как если бы эти переменные были самыми обычными, но любые функции классу не принадлежащие свободного доступа к этим переменным через объект класса иметь не будут.
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
32
33
34
#include <iostream>
usingstd::cout;
usingstd::cin;
classsumma
{
intx,y;// по умолчанию private
public:
voidget_xy()
{
cout<<"Wwedi X: ";
cin>>x;
cout<<"Wwedi Y: ";
cin>>y;
}
intsum_xy()
{
returnx+y;
}
}s1;
intmain()
{
s1.get_xy();
cout<<s1.x<<'\n';//Нельзя, потому что x закрыто классом
}
В рассматриваемом в эитой статье примере функция summ_xy отдаёт сумму двух чисел, поэтому, чтобы можно было присваивать отдаваемый функцией результат в переменные, тип функции задан int.
Подводим итоги:
Класс есть структура, в которой доступ по умолчанию private.
Класс — это собственный тип данных.
Класс — это некоторая идея еще не существующего объекта, в которой воедино собраны все детали, все свойства и все нужные действия необходимые для будущего объекта.
Создается класс с помощью слова class (struct,union).
В классе class модификатор доступа по умолчанию private:
В классе struct модификатор доступа по умолчанию public:
То, что описано внутри public, доступно по всей программе, а то, что написано внутри private, доступно только внутри класса.
Функции внутри класса называют методами класса или, более правильно, функциями-членами класса.
Объект — это экземпляр класса.
Объект есть воплощение вашей идеи, описанной в классе, во что-то реально существующее.
Доступ вовнутрь класса осуществляется задействованием названия объекта с применением к нему операции .
Наконец-то кто-то все объяснил подробно и доходчиво, а то все уроки для начинающих сводятся к "вот класс, тут все просто. Вываливаем на страницу листинг без комментариев. Видите, все просто и понятно, урок окончен".
Спасибо огромное! Благодаря вашему сайту я поняла суть класса. Как правильно начинать работать с классами и как правильно разграничить основную программу, заголовочный файл и файл-реализацию. Ваша помощь НЕОЦЕНИМА!!! Ведь главное разобраться в первый раз, а потом наращивать опыт!!!
А ну что могу сказать подводя итоги, не плохая статья даже очень ни чего скажем на 4 с минусом прокатит под пиво.
Да ладно классная статья спасибо большое!!!
Аааа ну что же подводя итоги скажу, что статья не плохая такая знаете 4 с минусом и то под пиво.
Да ладно классно доходчиво на самом деле написано СПАСИБО!!!
Функции внутри класса называют методами класса или полями класса (это я не писал, но знать надо)
насколько я знаю поле класа ето вроде переменная? разве нет?
Вроде все понятно, только зачем нужен объект? Ведь есть название класса. Почему не обращаться непосредственно к классу. Вроде как лишнее звено выходит. Типа есть конкретный адрес у здания, а мы говорим — иди в музей археологии.
Чтобы был выбор в музеях.
Станете ли Вы говорить "из музея такого-то адреса принесите в музей такого-то адреса картину такого-то адреса", когда можно сказать, что "из музея А нужно принести в музей Б картину X"
Название класса — это тип.
Объект — это конкретная сущность такого типа.
Создайте из одного имени два и более независимых конкретных адреса.
Название класса — это описание, чертёж.
А объект класса — это воплощение чертежа.
Наконец-то кто-то все объяснил подробно и доходчиво, а то все уроки для начинающих сводятся к "вот класс, тут все просто. Вываливаем на страницу листинг без комментариев. Видите, все просто и понятно, урок окончен".
Да, так и сводят. Спасибо
Да, самое простое и лучшае объяснения!Спасибо огромное,теперь все понятно!
отличная статья! сразу и по делу, без зауми и лишних слов! то что нужно
автору респект и процветания)))
присоединяюсь к благодарностям. доходчивое, подробное объяснение. не в каждом учебнике такое встретишь, не то что в не просторах всемирной мусорки
ну как тут не поблагодарить автора????
Спасибо! Сразу появилось желание прочитать все ваши уроки!
Все супер! Идеальный урок, спасибо автору 😉 пойду читать остальные уроки..
коменты один и тот же пишет??? ))))
Отличнейшый урок по класах просто и понятно 😉
Спасибо огромное! Благодаря вашему сайту я поняла суть класса. Как правильно начинать работать с классами и как правильно разграничить основную программу, заголовочный файл и файл-реализацию. Ваша помощь НЕОЦЕНИМА!!! Ведь главное разобраться в первый раз, а потом наращивать опыт!!!
Спасибо огромное!!!
А ну что могу сказать подводя итоги, не плохая статья даже очень ни чего скажем на 4 с минусом прокатит под пиво.
Да ладно классная статья спасибо большое!!!
Аааа ну что же подводя итоги скажу, что статья не плохая такая знаете 4 с минусом и то под пиво.
Да ладно классно доходчиво на самом деле написано СПАСИБО!!!
Отличная статья, автору огромное СПАСИБО)
Автору огромнейший респект! Только благодаря ему я понял эти классы буквально минут за 12!
спасибо автору!
У меня код не работает. Пишет «идентификатор не объявлен».
После
#include<iostream>
дописать
using namespace std;
не панимаюю!!!!!!!!!!!!!!!!!!!!!!!!!1
не панимаюю бред ваще!! фу
Кто не понимает начинайте со структур. Материал изложен идеально как для новичка… сижу и сам прозреваю, что ж я с первого раза то не понял ))))
Усё понятно ,спасибо )
Функции внутри класса называют методами класса или полями класса (это я не писал, но знать надо)
насколько я знаю поле класа ето вроде переменная? разве нет?
Да. Функции не называют полями класса.
Не понятно ни хреееена!((
Вроде все понятно, только зачем нужен объект? Ведь есть название класса. Почему не обращаться непосредственно к классу. Вроде как лишнее звено выходит. Типа есть конкретный адрес у здания, а мы говорим — иди в музей археологии.
Чтобы был выбор в музеях.
Станете ли Вы говорить "из музея такого-то адреса принесите в музей такого-то адреса картину такого-то адреса", когда можно сказать, что "из музея А нужно принести в музей Б картину X"
Название класса — это тип.
Объект — это конкретная сущность такого типа.
Создайте из одного имени два и более независимых конкретных адреса.
Название класса — это описание, чертёж.
А объект класса — это воплощение чертежа.
Спасибо огромное.Наконец-то я понятно что это такое и как оно работает.Респект автору.
Спасибо!!! Вы единственный сайт на котором я смог найти доходчивое объяснение классов!
Thankee!
Наконец-то кто-то доходчиво объяснил, 2 месяца не мог понять и тут всё понял за пару часов)) ещё раз спасибо!
Спасибо огромное!
Отличная статья!!! Теперь все понятно
Отличный урок, правда я себе ><eP сломал в попытках понять зачем тут conio а так всё понял сразу, спасибо)