Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
emperio
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 7
#1

Приведите ситуации когда использование классов лучше структур и функций - C++

25.10.2012, 20:31. Просмотров 1405. Ответов 9
Метки нет (Все метки)

Не соображу, зачем нужны классы? Когда их применение предпочтительнее использования структур и функций и почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 20:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приведите ситуации когда использование классов лучше структур и функций (C++):

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов - C++
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

Использование функций и структур - C++
Имеется две задачки, скажу честно , еще не решал...не успеваю...пожалуйста, уважаемые программисты помогите..буду очень признателен... ...

Создание программы с использованием собственных функций. Использование массивов и структур - C++
Здравствуйте! Помогите, пожалуйста, решить задачу. Вот текст: Существует 3 категории учеников: отличник, хорошист, двоечник. ...

Ситуации, когда ссылки или указатели нежелательны - C++
привет. хочю спросить, на какие фундаментальные(стандартные - std::) типы не следует объявлять ссылки/указатели при объявлении параметров...

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h - C++
Помогите решить задания: 1.Дано натуральное число n. Найти разность между первой цифрой этого числа и суммой всех остальных. ...

9
isvpro
72 / 7 / 1
Регистрация: 07.10.2009
Сообщений: 51
25.10.2012, 20:45 #2
И классы и структуры по сути являются "контейнерами", которые используются для объединения похожих данных (и функций).
И классы и функции в принципе полностью взаимозаменяемы - и в классе и в функции можно объявить как переменные (поля), так и методы выполняющие действия над ними. Разница лишь в том, что в классе все по умолчанию скрыто (private), а в структуре наоборот все по умолчанию открыто (public).
Т.е. по сути это абсолютно идентичные сущности и можно использовать одно вместо другого и наоборот. НО классы обычно используются для объединения параметров и действий над ними (причем эти параметры скрываются от остального "мира" программы - т.н. инкапсуляция происходит), а структуры просто используются для объединения однородных данных.
И классы и структуры становятся реально полезными только при крупных проектах, когда человек не может держать весь код в голове(который написал ранее), ведь надо помнить все имена функций, переменных, связи между ними и т.д. а засовывание всего этого хозяйства в один объект который описывает близкие по смыслу значения избавляет нас от лишней головной боли позволяй думать больше о проектировании программы, а не о запоминании где что как называется.
В целом доступно? или что то отдельно описать?
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
25.10.2012, 20:51 #3
Ну, это вопрос философский, и его уже обсуждали.
0
emperio
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 7
25.10.2012, 20:57  [ТС] #4
Принцип работы я понимаю. Единственный сомнительный плюс, который я вижу - это вызов функций без передачи параметров, на некоторых сайтах пишут что это короче, читаемее и вообще "пантово".
В целом, у меня в коде отдельно функции, отдельно структуры, и вроде всё и понятно. Если я из этого построю гигантский класс, не выйдет ли больше путаницы? Мне кажется выйдет...
Потом не понятно, если я использую массив структур, то память будет занята только под данные. Если я сделаю класс (зафигачу функции в структуру), то память будет занята еще и методами этого класса. Один и тот же метод будет раскопирован по памяти ровно столько раз, сколько элементов в массиве, - выйдет нерациональное расходование памяти,.. если конечно компилятор не догадается и не оптимизирует...
Может есть еще аргументы?
0
isvpro
72 / 7 / 1
Регистрация: 07.10.2009
Сообщений: 51
25.10.2012, 21:07 #5
Вызов функции без передачи параметров - сомнительный плюс. Чем это может быть лучше - ума не приложу. Если цель - ускорить передачу - можно передавать по указателю на константу или по константной ссылке. Но в любом случае даже в классах есть функции с параметрами (взять хотя бы перегрузку операторов "+", "-" и т.д.).
Давайте прикинем - какой ряд действий можно совершить функцией без параметров в классе, а точнее чего нельзя совершить - судя по всему без параметров не получится взаимодействия объекта класса с другими объектами того же класса (как? =)))
Поэтому, если нужно например сложить два объекта класса и присвоить результат третьему объекту (факт есть факт -придется два объекта передать в качестве параметра - лучше по ссылке).
Так что с этим "аргументом" надеюсь объяснил.
Строить гигантский класс конечно не стоит. Во первых если Вы можете обойтись без классов - лучше так и делать, потому что программа будет работать быстрее (если сомневаетесь - поместите весь код в цикл на 1000 раз и замерьте время в одном и в другом случае =)).
Но если код начинает неимоверно расти и структура начинает быть такой сложной, что голова идет кругом - тогда начинаем переходить на классы.
Классы помогают структурировать программу, сделать код более читаемым для других разработчиков.
Насчет памяти под методы класса - не переживайте они создаются в памяти ровно один раз для всех объектов класса. только один!
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
25.10.2012, 21:08 #6
Цитата Сообщение от emperio Посмотреть сообщение
Если я из этого построю гигантский класс, не выйдет ли больше путаницы? Мне кажется выйдет...
сомнительна цель гигантского класса. Если у вас класс автомобиль, вы врядли в нем будете полностью описывать его сущность, а создадите другие маленькие классы.

Цитата Сообщение от emperio Посмотреть сообщение
Один и тот же метод будет раскопирован по памяти ровно столько раз, сколько элементов в массиве
вы заблуждаетесь.
0
isvpro
72 / 7 / 1
Регистрация: 07.10.2009
Сообщений: 51
25.10.2012, 21:23 #7
Автор остались еще вопросы? спрашивай не стесняйся - будем вместе разбираться =)
0
emperio
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 7
25.10.2012, 21:40  [ТС] #8
Спасибо, вроде всё прояснилось. sizeof struct и class я всётаки проверю, не может быть чтобы методы не занимали память
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
25.10.2012, 21:45 #9
Цитата Сообщение от emperio Посмотреть сообщение
Спасибо, вроде всё прояснилось. sizeof struct и class я всётаки проверю, не может быть чтобы методы не занимали память
Почему не может быть?
0
isvpro
72 / 7 / 1
Регистрация: 07.10.2009
Сообщений: 51
25.10.2012, 23:28 #10
Методы занимают место, но только один раз. Подумайте сами - ведь код у них совершенно идентичный для всех объектов класса. Зачем программе хранить лишние данные, если они абсолютно одинаковы? Поля же наоборот у каждого объекта свои - и тут действительно нужно для них выделить место, но для функций только один раз и тогда каждый объект будет вызывать функцию (одну и туже). При этом эта функция может ссылаться напрямую на поля того объекта, который вызвал эту функцию.
Приведу пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class myclass
{
private:
    int a;
    int b;
public:
    myclass(int x, int y): a(x), b(y) {}
    void add(myclass mc1, myclass mc2)
    {
        a = mc1.a + mc2.a;
        b = mc1.b + mc2.b;
    }
};
Если Вы теперь создадите в функции main например три объекта класса вот так
myclass m1(5,6);
myclass m2(4,9);
myclass m3;

и вызовете функцию m3.add(m1,m2);
тогда Вы передадите фактически объекту m3 два объекта в виде параметров, но функция для них все равно одна и та же. Поэтому m3 - может иметь доступ непосредственно к полям (без операции доступа к полям класса ".").
Надеюсь понятно объяснил.
0
25.10.2012, 23:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 23:28
Привет! Вот еще темы с ответами:

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя. - C++
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между функциями с помощью глобального...

Использование строк.Использование структур - C++
Задачка: Дана строка,состоящая из групп нулей и едениц. Найти и вывести на экран группы с нечетным количеством символов. И еще одна: ...

Операторы классов и структур - C++
Извините если повторяюсь с вопросом. Я не совсем понимаю суть работы операторов классов и структур - "::", "->", ".". Объясните или скажите...

Различия структур и классов - C++
Решил я понять зачем структуры в C++ нужны. Написал и оно заработало: #include <iostream> using namespace std; struct B { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.