Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/125: Рейтинг темы: голосов - 125, средняя оценка - 4.82
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
1

Отличия между структурами и классами

18.08.2010, 12:38. Показов 25716. Ответов 58
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Объясните пожалуйста, в С++, получается, что структура отличается от класса только тем, что у нее по умолчанию все данные public?
Т.е. наследовать структуры я тоже могу. Тогда как-то непонятен смысл создания двух одинаковых типов объектов, только что с разными названиями.
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2010, 12:38
Ответы с готовыми решениями:

Отличия между классами и массивами
Уважаемые программисты объясните пожалуйста Чем отличается массивы от...

Отличия между классами String и StringBuilder
Расскажите пожалуйста про основные отличия между классами String и StringBuilder.

Отличия между классами для работы с интернетом
Добрый день, не могу понять ситуацию, как и для чего мелкософт расплодили дублирующие классы для...

Разница между классами и структурами и другие моменты
Добрый день! Разбираю разницу между классами и структурами, и возник следующий вопрос при создании...

58
55 / 44 / 5
Регистрация: 16.07.2011
Сообщений: 73
28.07.2011, 10:11 21
Author24 — интернет-сервис помощи студентам
half-node,
Структура - это набор переменных разного типа без каких либо функций
класс- это набор разного типа переменных + функции обработки переменных этого класса

Добавлено через 3 минуты
half-node, Структура — это совокупность переменных, объединенных под одним именем. С помощью структур удобно размещать в смежных полях связанные между собой элементы информации. Объявление структуры создает шаблон, который можно использовать для создания ее объектов (то есть экземпляров этой структуры). Переменные, из которых состоит структура, называются членами. (Члены структуры еще называются элементами или полями.)

Добавлено через 1 минуту
half-node,
выглядит структура примерно так
C
1
2
3
4
5
6
7
8
struct addr
{
  char name[30];
  char street[40];
  char city[20];
  char state[3];
  unsigned long int zip;
};
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
28.07.2011, 10:14 22
ViNew, сказали же, что не т формальной разницы между структурой и классом в C++, кроме спецификатора доступа по-умолчанию. И сделано это ради совместимости с языком Си, то есть чтобы сишнйы код компилился компиляторами C++.
Разница исключительно идеалогическая. Кому-то не нравится выделять структуры как сущности с поведением, а только как некий набор данных. Кому-то на это наплевать.

Цитата Сообщение от ViNew Посмотреть сообщение
Структура - это набор переменных разного типа без каких либо функций
Разве в этом коде что-то неправильно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct example {
   example(int _x) : x(_x) {
   }
   
   int get_x() const {
      return x;
   }
   
private:
   int x;
};
 
int main() {
   std::cout << example(5).get_x() << std::endl;
   return 0;
}
Цитата Сообщение от ViNew Посмотреть сообщение
без каких либо функций
Цитата Сообщение от ViNew Посмотреть сообщение
+ функции обработки переменных этого класса
Эти "функции" называются методами.
0
55 / 44 / 5
Регистрация: 16.07.2011
Сообщений: 73
28.07.2011, 10:15 23
half-node,
а вот так может выглядеть простой класс

C++
1
2
3
4
5
6
class class_name
 
{ 
   int data_member; // Элемент данных 
   void show_member(int); // Функция-элемент 
};
0
Заблокирован
28.07.2011, 10:27 24
Цитата Сообщение от ViNew Посмотреть сообщение
а вот так может выглядеть простой класс
а сложный как выглядит? если ты имеешь ввиду что это POD, то спешу огорчить - это не так
0
55 / 44 / 5
Регистрация: 16.07.2011
Сообщений: 73
28.07.2011, 11:05 25
fasked, Код правильный я с тобой согласен, то что многим наплевать , тоже согласен но я думаю сознательные программисты разделяют этих два понятия даже если они имеют почти одинаковые возможности.

Добавлено через 6 минут
LosAngeles, POD- называется структура которая не содержит функции - члены а только члены данные.
0
Заблокирован
28.07.2011, 11:17 26
Цитата Сообщение от ViNew Посмотреть сообщение
LosAngeles, POD- называется структура которая не содержит функции - члены а только члены данные.
нет...

Добавлено через 3 минуты
хотя в любом случае непонятно почему class_name простой. Первый раз вижу такую классификацию классов на простые и сложные.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 11:25 27
Цитата Сообщение от ViNew Посмотреть сообщение
fasked, Код правильный я с тобой согласен, то что многим наплевать , тоже согласен но я думаю сознательные программисты разделяют этих два понятия даже если они имеют почти одинаковые возможности.

Добавлено через 6 минут
LosAngeles, POD- называется структура которая не содержит функции - члены а только члены данные.
Нет. Вот контр-пример:
C++
1
struct Str { std::string s; };
Это НЕ POD.
0
Заблокирован
28.07.2011, 11:27 28
и ещё один
C++
1
2
3
4
5
6
struct class_name
 
{ 
   int data_member; // Элемент данных 
   void show_member(int); // Функция-элемент 
};
POD
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 11:34 29
Цитата Сообщение от LosAngeles Посмотреть сообщение
и ещё один
C++
1
2
3
4
5
6
struct class_name
 
{ 
   int data_member; // Элемент данных 
   void show_member(int); // Функция-элемент 
};
POD
Это - POD. А вот ваше определение POD, которое я видел выше - неверно. Вот что такое POD:
Стандарт [1-3.9] определяет, что объекты встроенных типов относятся к так называемым POD-объектам (Plain Old Data). Кроме встроенных типов к POD-объектам относятся перечисления, указатели, массивы, структуры и объединения (union). Как видим, все типы, изначально определенные в С, относятся к POD-типам. Что касается классов, то POD-классами являются только классы с тривиальным конструктором. Тривиальный конструктор — это конструктор, создаваемый автоматически, и класс при этом должен удовлетворять следующим условиям:
1. Класс не должен содержать виртуальных функций.
2. Все поля в классе должны быть POD-объектами.
3. Если класс является наследником, то базовый класс должен иметь тривиальный конструктор, и наследование не должно быть виртуальным.
На практике это означает, что простой класс-ненаследник без конструкторов и виртуальных функций является POD-классом. В частности, пустой класс является POD-классом. Время жизни POD-объектов определяется так же, как и время жизни объектов встроенных типов.
Это же относится к struct и union
2
Заблокирован
28.07.2011, 11:37 30
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Это - POD. А вот ваше определение POD, которое я видел выше - неверно
только оно не моё я никаких определений не давал
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 11:39 31
Пардон, это ViNew дал определение...
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.07.2011, 11:39 32
будет ли верным определение: "все что может быть мембером uniona - POD" в рамках стандарта от 2003?
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 11:42 33
Цитата Сообщение от Maxwe11 Посмотреть сообщение
будет ли верным определение: "все что может быть мембером uniona - POD" в рамках стандарта от 2003?
А нетривиальный конструктор? Мы можем его написать.
Кроме того, надо смотреть стандарт, нет ли ограничений на мемберство в unione - я просто не помню.
Дополнение.
Студия 2010:
C++
1
2
3
union a
{ vector<int> A;
};
выдает ошибку: Error 1 error C2621: member 'a::A' of union 'a' has copy constructor
1
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
28.07.2011, 14:45 34
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
нет ли ограничений на мемберство в unione - я просто не помню.
Кое-что есть:
A union can have member functions (including constructors and destructors), but not virtual (10.3) functions.
An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects.
Добавлено через 15 минут
C++0x, правда, добавляет таку возможность:
If a union has a member with a user-defined constructor, copy, or destructor then that special function is deleted; that is, it cannot be used for an object of the union type. This is new.
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 14:58 35
asics, ну вот.
Как раз на нетривиальный copy-constructor VC++ 2010 и жаловался. Все правильно!
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
28.07.2011, 20:19 36

Не по теме:

Тему интересно почитать хотя бы из-за того ка "прошаренные" новички на форуме объясняют как истину последней инстанции что такое структура и что такое класс :D Спасибо им за поднятое настроение.


Побуду кепом: автореферентные классы/структуры создаются несколько по другому:
Так в классе один из объектов может быть этого же типа
C++
1
2
3
4
5
class Test
{
...
Test a;
}
а вот в структуре уже можно поместить только указатель на неё же
C++
1
2
3
4
5
struct Test
{
...
*Test a;
}
Но это так, чисто формальности.
0
Заблокирован
28.07.2011, 20:45 37
Цитата Сообщение от Gepar Посмотреть сообщение
Так в классе один из объектов может быть этого же типа
да ну как это возможно. Рекурсия получается. Мой msvs 2008 не принял это
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.07.2011, 20:49 38
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Gepar Посмотреть сообщение
автореферентные классы/структуры
это что?

Цитата Сообщение от Gepar Посмотреть сообщение
Так в классе один из объектов может быть этого же типа
C++
1
2
3
4
5
class Test
{
...
Test a;
}
с какого перепугу?

Цитата Сообщение от Gepar Посмотреть сообщение
а вот в структуре уже можно поместить только указатель на неё же
C++
1
2
3
4
5
struct Test
{
...
*Test a;
}
это даже не указатель на структуру, а черт знает что

Добавлено через 1 минуту
Цитата Сообщение от CAHTEXHUK Посмотреть сообщение
да ну как это возможно. Рекурсия получается. Мой msvs 2008 не принял это
и не должен, потому что на момент компиляции размер класса Test неопределен

Добавлено через 1 минуту
Цитата Сообщение от Gepar Посмотреть сообщение
Но это так, чисто формальности.
с .NET-ом путаете товарищ!
4
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
28.07.2011, 20:50 39
CAHTEXHUK, а вот так:
C++
1
2
3
4
5
class Test
{
...
Test *a;
}
Извините, писал простой пример без компилятора и прочего, а в таких случаях вечно что-то забудешь, то точку с запятой то скобки уравновесить, в даном случае я забыл *.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
28.07.2011, 20:52 40
Gepar, тогда в чём отличия?
0
28.07.2011, 20:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2011, 20:52
Помогаю со студенческими работами здесь

Отличия между ++value и value++
Все используют по разному, чем эти отличия отличаются друг от друга. Или ничем ?

Отличия между видеокартами
Доброго вечера форумчане! в чем отличия от Radeon R9 280X от R9 280 (без икса) сильно ли они...

Отличия между книгами
Добрый день! Решил прикупить себе Искусство программирования Кнута. Так вот... не могу понять в...

Отличия между DVD
Задали мне тут вопрос, в чем отличие между двумя этими оптическими носителями, с точки зрения...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru