23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206

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

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

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

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

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

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

58
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
28.07.2011, 20:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Maxwe11 Посмотреть сообщение
это что?
это ссылающийся сам на себя класс/структура.
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
29.07.2011, 01:10
А примеры применений автореферентных классов какие? Скажем структуры с ссылкой для себя используют для создания списков в любом яз программирования. Это - азбука. А вот об автореферентных классах сведений гораздо меньше.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
29.07.2011, 01:21
Цитата Сообщение от 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
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
29.07.2011, 09:45
Еще приведу такой пример. В MSVS 2010 (про другие незнаю) если написать например struct A и сознательно сделать в ней (структуре) ошибку, то в сообщении об ошибке будет информация следующего рода:
error: Class A blablabla
Это для тех, кто думает, что структура и класс это разные вещи
2
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
30.07.2011, 02:49
Ну хорошо. Конструктив лишь в том, что может быть класс, содержащий указатель на себя типа
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
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
30.07.2011, 05:17
Цитата Сообщение от eugrita Посмотреть сообщение
Сколько на самом деле объектов?
Один
Цитата Сообщение от eugrita Посмотреть сообщение
Как это объяснить?
Мне больше интересно, как объяснить, что этот код отработал, а не просто упал?
0
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
30.07.2011, 06:31
Цитата Сообщение от eugrita Посмотреть сообщение
в класс введена статическая переменная n- счетчик экземпляров.
Однако при вызовах по ссылкам как полагаю, должен вызываться конструктор класса, но счетчик экземпляров все время n=1 . Как это объяснить? Сколько на самом деле объектов?
Не должен. Конструктор вызывается только при создании объекта, а не при переходах по указателю. Конструктор всего один раз вызывался, значит n только один раз увеличится на 1.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
30.07.2011, 07:24
eugrita, хочешь примеров - почитай мою книжку:
http://www.ozon.ru/context/detail/id/3515464/
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.07.2011, 09:13
Цитата Сообщение от fasked Посмотреть сообщение
как объяснить, что этот код отработал, а не просто упал?
Элементарно. К статической переменной можно получить доступ через любой мусор, приведённый к нужному типу.) Ведь this там не используется, важен только класс. Т.е. строчки 16-19 эквивалентны обращению test::n.

Добавлено через 1 минуту
Цитата Сообщение от eugrita Посмотреть сообщение
Однако при вызовах по ссылкам как полагаю, должен вызываться конструктор класса, но счетчик экземпляров все время n=1
Это не ссылки, а указатели - раз. Объект создаётся только в строке 15 - это два.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
30.07.2011, 10:47
Как по мне основное отличие классов от структур - это наличие функций и методов в классе.
Хотя структуру как классы имеют свои переменный функций и методов в них нет, они могут быть внешними но не принадлежать структуре. В этом плане структура являет собой урезанную в функциональных возможностях весию класса
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
30.07.2011, 10:58
-=ЮрА=-, сюрприз:
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
#include <iostream>
#include <string>
 
struct hello
{
private:
    std::string person;
 
public:
    hello(const std::string&);
 
    void greet() const;
};
 
hello::hello(const std::string& p)
    : person(p)
{
}
 
void hello::greet() const
{
    std::cout << "Hello, " << person << "!" << std::endl;
}
 
 
int main()
{
    hello me("nameless");
    me.greet();
 
    return 0;
}
Тысячу раз же уже пережевывали, что структуры в C++ могут иметь и методы, и конструкторы-деструкторы, и все прочее, что имеют классы. У них лишь спецификатор доступа по умолчанию другой
1
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
30.07.2011, 11:26
Ну хорошо пусть так. А чего добился я этими вызовами? Обращения к 1 экз класса получаетcя?
Вопрос остается : в каких случаях прием использования ссылки внутри класса на самого себя эффективно работает? Его обл применения?

Добавлено через 7 минут
Ну хорошо. А чего я добился вызовом скажем
k=s->a->a->n
- обращение к тому же экземпляру переменной n? Такой синтаксис вроде возможен только
в автореферентных классах
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.07.2011, 12:42
Цитата Сообщение от eugrita Посмотреть сообщение
в каких случаях прием использования ссылки внутри класса на самого себя эффективно работает?
что значит эффективно работает? покажите тогда пример не эффективной работы тогда

Цитата Сообщение от eugrita Посмотреть сообщение
Его обл применения?
структуры данных

Добавлено через 1 минуту
Цитата Сообщение от eugrita Посмотреть сообщение
- обращение к тому же экземпляру переменной n? Такой синтаксис вроде возможен только
в автореферентных классах
такое возможно для всех статических членов
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
30.07.2011, 12:51
под словами эффективно работает понимаю некую область задач или структур данных, создание которых происходит с помощью указанного приема - автореферентного класса.
А то мы, блин изучаем разные тонкости, возможности да еще в разных версиях С++ а к чему это все прилепить - в обсуждении ручки не доходят. Вроде как чистая математика- чистое искусство
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.07.2011, 13:01
Цитата Сообщение от eugrita Посмотреть сообщение
Вопрос остается : в каких случаях прием использования ссылки внутри класса на самого себя эффективно работает? Его обл применения?
Т.е. реализации списков и подобных контейнеров в качестве ответа тебя не устроило?

Или ты не правильно понял выражение "ссылки внутри класса на самого себя"? Что непонятного в том, что объекты могут ссылаться друг на друга? Это же не ссылка объекта на себя, а ссылка на объект этого класса. Совершенно другой объект, расположенный по другому адресу.

На тебе простой пример. Есть класс окна, в нём куча контролов. Контролы это тоже окна. Т.е. Класс окна и классы контролов совпадают (благодаря полиморфизму). Поэтому в классе окна хранятся указатели на контролы, а в контролах указатели на обрамляющее их окно. И никакой математики.
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
30.07.2011, 16:12
нечто похожее есть в заданиях по программированию Бауманки:
29.Моделировать очередь (руками), в качестве элементов которой могут использоваться числа и слова. Операции: добавление элемента, удаление элемента, печать элементов. Создать класс - потомок, который содержит процедуру сортировки слов по алфавиту. ..
27.Описать объект, включающий заданные поля и методы. Написать программу, которая создает массив объектов и список объектов и содержит процедуры, работающие с указан-ными структурами.
Объект - слово. Параметры: текст, длина, количество согласных букв. Методы: конструктор, определяющий поле текста и длину, и процедура, определяющая количество глас-ных букв. Определить процент гласных букв в предложении. Реализовать два варианта (с массивом и списком).
для 29. При решении 29 создавалось несколько классов TElement,TNum,TSlovo - как его дочерние, и класс TQueue...: вроде класс TElement - автореферентный (только я такого слова тогда еще не знал)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TElement
{ public:
TElement *nxt;
TElement();
 virtual ~TElement() {cout<<"Delete TElement.";}
 virtual void Print()=0;
};
  
class TQueue
{
public:
  TQueue();//конструктор
  ~TQueue();  //деструктор
  TElement *First(){return cur=first;}
  TElement *Last(){return cur=last;}
  TElement *Next(){return cur=cur->nxt;}
  void addEL(TElement *val);//добавление элемента
  void delEL(); //удаление 1 элем
  void print(); //печать всех элементов
 virtual  void printS(); //печать элементов -строк
private:
 TElement *first,*last,*cur;
 };
Да тогда все применения - разновидности списков но не просто из данных а из объектов классов
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.07.2011, 16:16
eugrita, и к чему это? это типо предложение нам решить?
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
30.07.2011, 16:23
да нет, конечно. Я их сам в свое время решил как халтура для студента. Но теперь только понял, что эта тематика задач похоже относится к обсуждаемой теме. А вы несогласны?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.07.2011, 16:25
Цитата Сообщение от eugrita Посмотреть сообщение
А вы несогласны?
согласен, только просто странно видить задание в теме, оффтоп получается)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.07.2011, 16:25

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

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

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

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

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


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

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

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru