Зачем нужны классы?
Изучаю СИ++ после изучения СИ. Не пойму какой смысл в классах. То что они делают можно реализовать с помощью функций, структур и обычных переменных и массивов. Или я не прав? Для чего нужны классы?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Зачем нужны классы?
После Си решил попробовать Си++, после нескольких глав Дейтла понял что весь смысл плюсов в.
Зачем нужны классы и структуры?
1. Зачем нужны классы? 2. Зачем нужны аргументы в main()? 3. Зачем нужны структуры. struct.

Зачем нужны абстрактные классы и методы?
Можете объяснить в чём смысл абстрактного класса? Ведь с тем же успехом я могу написать: .
Не могу понять зачем нужны классы
Обьяснити начинающему программисту зачем нужны классы.
1370 / 593 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
Ну если в коде 1000 раз надо сокрыть части 1000 структур , то написание class вместо struct поможет сократить код на 1000 строчек.
![]()
![]()
21275 / 8292 / 637
Регистрация: 30.03.2009
Сообщений: 22,656
Записей в блоге: 30
Сообщение от Sinkha 
Или я не прав?
Сообщение от Sinkha 
Для чего нужны классы?
Классы не дают каких-то принципиально новых возможностей. Т.е. то, что ты можешь сделать с классами, всегда можно сделать и без классов. Классы относятся скорее к способу проектирования программы, чем к функциональным возможностям: есть виды задач, которые удобно решать при помощи классов, есть виды задач, где классы будут скорее мешать
Это примерно как в математике. Есть декартова система координат, а есть полярная. Одна ничем не лучше второй. Просто в одних случаях удобнее одна, в других — другая.
Классы — это НЕ единственное, на что упирается Си++. Классы во многом являются основой, на которой базируется шаблонное программирование. Зачем нужны классы скорее всего никто сразу не понимал. Поимев практический опыт работы, со временем понимание приходит само собой
Регистрация: 04.07.2015
Сообщений: 187
Этот код можно рассматривать как ООП? Доступ к функциям del и sum мы не имеем, они как бы «методы класса» (функции) ddaa.
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 35 36 37 38 39 40 41 42
int ddaa(int a, int b, int c); int del(int a, int b); int sum(int a, int b); int main(){ int a = 10; int b = 5; int c = 0; scanf("%d", &c); ddaa(a, b); printf ("%d", c); } int ddaa(int a, int b, int c){ if(c = 1 ) c = sum(int a, int b); else if (c = 2) c =del(int a, int b); return c; } int sum(int a, int b){ return a + b; } int del(int a, int b){ return a - b; }
Зачем нужны классы c
в первую очередь классы позволяют группировать код.
что код связанный с этим типом именно завязан на объекты оного.
ведь есть разница:
DoTurn(Player1);
Player1.DoTurn();
ключевые понятия это объект и класс
1)класс — это описание будущего объекта, его данных и возможностей.
2)объект — это экземпляр класса,
то есть при ООП, все что может делать(можно сделать) объект(с объектом) связанно с ним.
конечно это не значит что ООП маст хэв, дело вкуса и размеров проекта.
я для себя оценил уже прелести оного, потому стараюсь применять.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
| Пепел Феникса |
| Посмотреть профиль |
| Найти ещё сообщения от Пепел Феникса |
Форумчанин
Регистрация: 08.07.2010
Сообщений: 505
Ключевым понятием С++ является класс. Класс — это определяемый
пользователем тип. Классы обеспечивают упрятывание данных, их
инициализацию, неявное преобразование пользовательских типов, динамическое
задание типов, контролируемое пользователем управление памятью и средства
для перегрузки операций
Страуструп
Знающий не говорит, говорящий не знает (С) Лао Цзы
Для чего нужны классы, если можно все сделать в простой функции? (в C++) [закрыт]
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 8 лет назад .
Изучаю сейчас классы в C++. Для чего они нужны, если можно все сделать в простой функции? Только для того, чтобы все было в объектах? И еще такой вопрос. Видел, как в классах сразу функции написаны, и видел, как написаны только скелеты функций. Для чего?
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 20 фев 2015 в 10:25
409 2 2 золотых знака 11 11 серебряных знаков 26 26 бронзовых знаков
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Этот вопрос, скорее, можно перестроить в более широкий — зачем нужно ООП? Почитайте статью и про ООП вообще. Это действительно довольно большая тема для одного ответа на данном ресурсе. Думаю, поняв концепцию ООП, что такое объект, в чем разница между объектом и классом, Вы придете к выводу, зачем и когда это нужно.
Но если вкратце: классы нужны для создания своих структур данных, которые будут содержать какую-то логику обработки. Вся логика хранится в описании класса, при этом оставляя в вызывающей программе лаконичные вызовы, без лишнего кода.
Cat cat; Dog dog; cat = new Cat(); //создаем кота dog = new Dog(); //создаем собаку cat.meow(); //кот мяукает dog.gav(); //пес лает
Еще понять многие вещи помогает игровая форма обучения. Попробуйте создать виртуальную рыбку, которая имеет свои координаты (например, в аквариуме) по x, y и z, у нее есть цвет, размер, она двигается, кушает, может размножаться. Создать эту рыбку, не прибегая к ООП, довольно сложно, а еще сложнее будет дополнять ее новыми фичами и сопровождать. В ООП это не составляет большого труда.
Обновлено:
Скелеты функций в классе-родителе — это абстракция. Например абстрактный класс Animal , нельзя будет создать объект (т.к. класс абстрактный), ведь не существует объекта просто животного. У него есть абстрактный метод breathing() (дыхание). В дочерних классах (не абстрактных), наличие абстрактного метода breathing() в Animal будет принуждать нас переопределить его. Нам нужно будет переопределить дыхание, например, для рыбы одним способом, для собаки — другим.
В двух словах — абстрактный класс — класс, от которого нельзя создать экземпляр. Служит для хранения общей логики. Абстрактный метод (скелет) — требует от программиста переопределения в дочерних классах. Логика у каждого может быть своя, а наличие обязательно.
Урок №113. Классы, Объекты и Методы
Хотя язык C++ предоставляет ряд фундаментальных типов данных (например, char, int, long, float, double и т.д.), которых бывает достаточно для решения относительно простых проблем, для решения сложных проблем функционала этих простых типов может не хватать.
Оглавление:
- Классы
- Методы классов
- Примечание о структурах в C++
- Заключение
- Тест
Классы
Одной из наиболее полезных особенностей языка C++ является возможность определять собственные типы данных, которые будут лучше соответствовать в решении конкретных проблем. Вы уже видели, как перечисления и структуры могут использоваться для создания собственных пользовательских типов данных. Например, структура для хранения даты:
struct DateStruct
Перечисления и структуры — это традиционный (не объектно-ориентированный) мир программирования, в котором мы можем только хранить данные. В C++11 мы можем создать и инициализировать структуру следующим образом:
DateStruct today < 12 , 11 , 2018 >; // используем uniform-инициализацию
Для вывода даты на экран (что может понадобиться выполнить и не раз, и не два) хорошей идеей будет написать отдельную функцию, например:
struct DateStruct
void print ( DateStruct &date )
std :: cout << date . day << "/" << date . month << "/" << date . year ;
DateStruct today < 12 , 11 , 2018 >; // используем uniform-инициализацию
today . day = 18 ; // используем оператор выбора члена для выбора члена структуры
print ( today ) ;
Результат выполнения программы:
В объектно-ориентированном программировании типы данных могут содержать не только данные, но и функции, которые будут работать с этими данными. Для определения такого типа данных в языке C++ используется ключевое слово class. Использование ключевого слова class определяет новый пользовательский тип данных — класс.
В языке C++ классы очень похожи на структуры, за исключением того, что они обеспечивают гораздо большую мощность и гибкость. Фактически, следующая структура и класс идентичны по функционалу:
struct DateStruct
class DateClass
int m_month ;
int m_year ;
Единственным существенным отличием здесь является public — ключевое слово в классе (о нем мы поговорим детально на соответствующем уроке).
Так же, как и объявление структуры, объявление класса не приводит к выделению какой-либо памяти. Для использования класса нужно объявить переменную этого типа класса:
DateClass today < 12 , 11 , 2018 >; // инициализируем переменную класса DateClass
В языке C++ переменная класса называется экземпляром (или «объектом») класса. Точно так же, как определение переменной фундаментального типа данных (например, int x ) приводит к выделению памяти для этой переменной, так же и создание объекта класса (например, DateClass today ) приводит к выделению памяти для этого объекта.
Методы классов
Помимо хранения данных, классы могут содержать и функции! Функции, определенные внутри класса, называются методами. Методы могут быть определены, как внутри, так и вне класса. Пока что мы будем определять их внутри класса (для простоты), как определить их вне класса — рассмотрим несколько позже.
Класс Date с методом вывода даты:
class DateClass
int m_month ;
int m_year ;
void print ( ) // определяем функцию-член
std :: cout << m_day << "/" << m_month << "/" << m_year ;
Точно так же, как к членам структуры, так и к членам (переменным и функциям) класса доступ осуществляется через оператор выбора членов ( . ):
class DateClass
int m_month ;
int m_year ;
void print ( )
std :: cout << m_day << "/" << m_month << "/" << m_year ;
DateClass today < 12 , 11 , 2018 >;
today . m_day = 18 ; // используем оператор выбора членов для выбора переменной-члена m_day объекта today класса DateClass
today . print ( ) ; // используем оператор выбора членов для вызова метода print() объекта today класса DateClass
Результат выполнения программы:
Обратите внимание, как эта программа похожа на вышеприведенную программу, где используется структура. Однако есть несколько отличий. В версии DateStruct нам нужно было передать переменную структуры непосредственно в функцию print() в качестве параметра. Если бы мы этого не сделали, то функция print() не знала бы, какую переменную структуры DateStruct выводить. Нам тогда бы пришлось явно ссылаться на члены структуры внутри функции.
Методы класса работают несколько иначе: все вызовы методов должны быть связаны с объектом класса. Когда мы вызываем today.print() , то мы сообщаем компилятору вызвать метод print() объекта today .
Рассмотрим определение метода print() еще раз:
void print ( ) // определяем метод
std :: cout << m_day << "/" << m_month << "/" << m_year ;
На что фактически ссылаются m_day , m_month и m_year ? Они ссылаются на связанный объект today (который определен caller-ом).
Поэтому, при вызове today.print() , компилятор интерпретирует:
m_day , как today.m_day ;
m_month , как today.m_month ;
m_year , как today.m_year .
Если бы мы вызвали tomorrow.print() , то m_day ссылался бы на tomorrow.m_day .
По сути, связанный объект неявно передается методу. По этой причине его часто называют неявным объектом.
Детально о том, как передается неявный объект методу, мы поговорим на соответствующем уроке. Ключевым моментом здесь является то, что для работы с функциями, не являющимися членами класса, нам нужно передавать данные в эту функцию явно (в качестве параметров). А для работы с методами у нас всегда есть неявный объект класса!
Использование префикса m_ (англ. «m» = «members») для переменных-членов помогает различать переменные-члены от параметров функции или локальных переменных внутри методов класса. Это полезно по нескольким причинам:
во-первых, когда мы видим переменную с префиксом m_ , то мы понимаем, что работаем с переменной-членом класса;
во-вторых, в отличие от параметров функции или локальных переменных, объявленных внутри функции, переменные-члены объявляются в определении класса. Следовательно, если мы хотим знать, как объявлена переменная с префиксом m_ , мы понимаем, что искать нужно в определении класса, а не внутри функции.
Обычно программисты пишут имена классов с заглавной буквы.
Правило: Пишите имена классов с заглавной буквы.
Вот еще один пример программы с использованием класса:
class Employee
std :: string m_name ;
double m_wage ;
// Метод вывода информации о работнике на экран
void print ( )
std :: cout << "Name: " << m_name <<
"\nId: " << m_id <<
"\nWage: $" << m_wage << '\n' ;
// Определяем двух работников
Employee john < "John" , 5 , 30.00 >;
Employee max < "Max" , 6 , 32.75 >;
// Выводим информацию о работниках на экран
john . print ( ) ;
std :: cout << std :: endl ;
max . print ( ) ;
Результат выполнения программы:
Name: John
Id: 5
Wage: $30
Name: Max
Id: 6
Wage: $32.75
В отличие от обычных функций, порядок, в котором определены методы класса, не имеет значения!
Примечание о структурах в C++
В языке Cи структуры могут только хранить данные и не могут иметь связанных методов. После проектирования классов (используя ключевое слово class) в языке С++, Бьёрн Страуструп размышлял о том, нужно ли, чтобы структуры (которые были унаследованы из языка Си) имели связанные методы. После некоторых размышлений он решил, что нужно. Поэтому в программах, приведенных выше, мы также можем использовать ключевое слово struct, вместо class, и всё будет работать!
Многие разработчики (включая и меня) считают, что это было неправильное решение, поскольку оно может привести к проблемам, например, справедливо предположить, что класс выполнит очистку памяти после себя (например, класс, которому выделена память, освободит её непосредственно перед моментом уничтожения самого класса), но предполагать то же самое при работе со структурами — небезопасно. Следовательно, рекомендуется использовать ключевое слово struct для структур, используемых только для хранения данных, и ключевое слово class для определения объектов, которые требуют объединения как данных, так и функций.
Правило: Используйте ключевое слово struct для структур, используемых только для хранения данных. Используйте ключевое слово class для объектов, объединяющих как данные, так и функции.
Заключение
Оказывается, Стандартная библиотека C++ полна классов, созданных для нашего удобства. std::string, std::vector и std::array — это всё типы классов! Поэтому, когда вы создаете объект любого из этих типов, вы создаете объект класса. А когда вы вызываете функцию с использованием этих объектов, вы вызываете метод: