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

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

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

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

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

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от eugrita Посмотреть сообщение
Однако при вызовах по ссылкам как полагаю, должен вызываться конструктор класса, но счетчик экземпляров все время n=1
Это не ссылки, а указатели - раз. Объект создаётся только в строке 15 - это два.
0
Заблокирован
Автор FAQ
30.07.2011, 10:47 50
Как по мне основное отличие классов от структур - это наличие функций и методов в классе.
Хотя структуру как классы имеют свои переменный функций и методов в них нет, они могут быть внешними но не принадлежать структуре. В этом плане структура являет собой урезанную в функциональных возможностях весию класса
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
30.07.2011, 10:58 51
-=ЮрА=-, сюрприз:
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 52
Ну хорошо пусть так. А чего добился я этими вызовами? Обращения к 1 экз класса получаетcя?
Вопрос остается : в каких случаях прием использования ссылки внутри класса на самого себя эффективно работает? Его обл применения?

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

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

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

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

На тебе простой пример. Есть класс окна, в нём куча контролов. Контролы это тоже окна. Т.е. Класс окна и классы контролов совпадают (благодаря полиморфизму). Поэтому в классе окна хранятся указатели на контролы, а в контролах указатели на обрамляющее их окно. И никакой математики.
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
30.07.2011, 16:12 56
нечто похожее есть в заданиях по программированию Бауманки:
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
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.07.2011, 16:16 57
eugrita, и к чему это? это типо предложение нам решить?
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
30.07.2011, 16:23 58
да нет, конечно. Я их сам в свое время решил как халтура для студента. Но теперь только понял, что эта тематика задач похоже относится к обсуждаемой теме. А вы несогласны?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.07.2011, 16:25 59
Цитата Сообщение от eugrita Посмотреть сообщение
А вы несогласны?
согласен, только просто странно видить задание в теме, оффтоп получается)
0
30.07.2011, 16:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2011, 16:25
Помогаю со студенческими работами здесь

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

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

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

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


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

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