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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 108, средняя оценка - 4.98
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
#1

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

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

Объясните пожалуйста, в С++, получается, что структура отличается от класса только тем, что у нее по умолчанию все данные public?
Т.е. наследовать структуры я тоже могу. Тогда как-то непонятен смысл создания двух одинаковых типов объектов, только что с разными названиями.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2010, 12:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отличия между структурами и классами (C++):

отличия между static и auto переменными - C++
Объясните пожалуйста чем отличаются переменные static и auto? Если можно покажите их отличие в простом примере.

Объясните отличия между двумя кодами - C++
Всем привет ! Чем отличается такой код for(...){ ... ... } от такого for(...)

В чем отличия между union и struct? - C++
Здравствуйте! Вопрос в названии темы

В чем отличия между выражением (expression) и оперетором (statement)? - C++
Здравствуйте, скажите пожалуйста в чем отличия между выражением и оператором? Если x=100 это выражение, то x=100; оператор? Тогда...

Взаимодействие между классами - C++
Суть проблемы такова: в одном файле classy.h объявлено несколько классов (classcontrol, class1, class2,class3). Необходимо сделать так,...

Взаимодействие между классами - C++
При попытке создать указатель на объект класса в public секции другого класса из которого будет обращение к его методу... Cook *cok ...

58
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 11:39 #31
Пардон, это ViNew дал определение...
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.07.2011, 11:39 #32
будет ли верным определение: "все что может быть мембером uniona - POD" в рамках стандарта от 2003?
0
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 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
asics
Freelance
Эксперт С++
2848 / 1783 / 144
Регистрация: 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
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 14:58 #35
asics, ну вот.
Как раз на нетривиальный copy-constructor VC++ 2010 и жаловался. Все правильно!
1
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
28.07.2011, 20:19 #36

Не по теме:

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


Побуду кепом: автореферентные классы/структуры создаются несколько по другому:
Так в классе один из объектов может быть этого же типа
C++
1
2
3
4
5
class Test
{
...
Test a;
}
а вот в структуре уже можно поместить только указатель на неё же
C++
1
2
3
4
5
struct Test
{
...
*Test a;
}
Но это так, чисто формальности.
0
CAHTEXHUK
Заблокирован
28.07.2011, 20:45 #37
Цитата Сообщение от Gepar Посмотреть сообщение
Так в классе один из объектов может быть этого же типа
да ну как это возможно. Рекурсия получается. Мой msvs 2008 не принял это
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
28.07.2011, 20:50 #39
CAHTEXHUK, а вот так:
C++
1
2
3
4
5
class Test
{
...
Test *a;
}
Извините, писал простой пример без компилятора и прочего, а в таких случаях вечно что-то забудешь, то точку с запятой то скобки уравновесить, в даном случае я забыл *.
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
28.07.2011, 20:52 #40
Gepar, тогда в чём отличия?
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
28.07.2011, 20:54 #41
Цитата Сообщение от Maxwe11 Посмотреть сообщение
это что?
это ссылающийся сам на себя класс/структура.
0
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 448
29.07.2011, 01:10 #42
А примеры применений автореферентных классов какие? Скажем структуры с ссылкой для себя используют для создания списков в любом яз программирования. Это - азбука. А вот об автореферентных классах сведений гораздо меньше.
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
29.07.2011, 01:21 #43
Цитата Сообщение от eugrita Посмотреть сообщение
А вот об автореферентных классах сведений гораздо меньше.
Да в принципе всё то же самое
C++
1
2
3
4
5
6
7
8
9
10
11
12
class StringList {
    class Node {
        std::string value;
        Node * next;
    public:
        Node(const std::string & str = "") : value(str), next(0) {}
        //...
    };
    Node * first;
    Node * last;
    //...
};
Ну а что-то вроде
C++
1
2
3
4
class A {
    A a;
    // ...
};
по-моему просто нигде не скомпилируется.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
29.07.2011, 09:45 #44
Еще приведу такой пример. В MSVS 2010 (про другие незнаю) если написать например struct A и сознательно сделать в ней (структуре) ошибку, то в сообщении об ошибке будет информация следующего рода:
error: Class A blablabla
Это для тех, кто думает, что структура и класс это разные вещи
2
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 448
30.07.2011, 02:49 #45
Ну хорошо. Конструктив лишь в том, что может быть класс, содержащий указатель на себя типа
C++
1
2
3
4
class test
{
  test * a;
};
Я бы хотел не играться возможностями которых в С++ а в MSVC 10 еще больше, а получить конструктивный ответ на вопрос: в какой ситуации эта конструкция используется и незаменима?
По поводу списков говорили - там достаточно структуры. Может список объектов с частично скрытыми полями и открытыми интерфейсами? Примеры?

Добавлено через 15 минут
да кстати провел эксперимент с похожим кодом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class test
{
 public:
   static int n;
  test * a;
  test () {
     n++;
               }
};
int test::n=0;
 
int main(int argc, char* argv[])
{
test * s=new test();
int k=s->a->n ;
k=s->a->n;  //k=1
k=s->a->a->n; //k=1
k=s->a->a->a->n;//k=1
        return 0;
}
в класс введена статическая переменная n- счетчик экземпляров.
Однако при вызовах по ссылкам как полагаю, должен вызываться конструктор класса, но счетчик экземпляров все время n=1 . Как это объяснить? Сколько на самом деле объектов?
0
30.07.2011, 02:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2011, 02:49
Привет! Вот еще темы с ответами:

Связь между 2 классами - C++
Есть 2 класса: Class A { private: B** arrayB;/нужно раньше объявить класс И ... }; A* Object

Что общего и какие отличия между одномерным и двумерным массивами - C++
Что общего и какие отличия между одномерным и двумерным массивами

Передача данных между классами - C++
Здравствуйте! Программирую графику на C++ под DirectX9, если точнее то пытаюсь написать простой редактор 3D графики. есть класс...

Отношения между классами и объектами - C++
Для каждого индивидуального варианта необходимо создать консольную программу на С++, реализующую отношение ассоциации (агрегации или...


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

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

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