Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/92: Рейтинг темы: голосов - 92, средняя оценка - 4.83
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
#1

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

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

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

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

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

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

В чем отличия между выражением (expression) и оперетором (statement)?
Здравствуйте, скажите пожалуйста в чем отличия между выражением и оператором?...

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

58
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
28.07.2011, 20:54 #41
Цитата Сообщение от Maxwe11 Посмотреть сообщение
это что?
это ссылающийся сам на себя класс/структура.
0
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 534
29.07.2011, 01:10 #42
А примеры применений автореферентных классов какие? Скажем структуры с ссылкой для себя используют для создания списков в любом яз программирования. Это - азбука. А вот об автореферентных классах сведений гораздо меньше.
0
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,312
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
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
29.07.2011, 09:45 #44
Еще приведу такой пример. В MSVS 2010 (про другие незнаю) если написать например struct A и сознательно сделать в ней (структуре) ошибку, то в сообщении об ошибке будет информация следующего рода:
error: Class A blablabla
Это для тех, кто думает, что структура и класс это разные вещи
2
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 534
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
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.07.2011, 05:17 #46
Цитата Сообщение от eugrita Посмотреть сообщение
Сколько на самом деле объектов?
Один
Цитата Сообщение от eugrita Посмотреть сообщение
Как это объяснить?
Мне больше интересно, как объяснить, что этот код отработал, а не просто упал?
0
An1ka
67 / 72 / 9
Регистрация: 30.06.2011
Сообщений: 176
30.07.2011, 06:31 #47
Цитата Сообщение от eugrita Посмотреть сообщение
в класс введена статическая переменная n- счетчик экземпляров.
Однако при вызовах по ссылкам как полагаю, должен вызываться конструктор класса, но счетчик экземпляров все время n=1 . Как это объяснить? Сколько на самом деле объектов?
Не должен. Конструктор вызывается только при создании объекта, а не при переходах по указателю. Конструктор всего один раз вызывался, значит n только один раз увеличится на 1.
0
ValeryLaptev
Эксперт С++
1050 / 829 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
30.07.2011, 07:24 #48
eugrita, хочешь примеров - почитай мою книжку:
http://www.ozon.ru/context/detail/id/3515464/
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 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
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 534
30.07.2011, 11:26 #52
Ну хорошо пусть так. А чего добился я этими вызовами? Обращения к 1 экз класса получаетcя?
Вопрос остается : в каких случаях прием использования ссылки внутри класса на самого себя эффективно работает? Его обл применения?

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

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

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

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

На тебе простой пример. Есть класс окна, в нём куча контролов. Контролы это тоже окна. Т.е. Класс окна и классы контролов совпадают (благодаря полиморфизму). Поэтому в классе окна хранятся указатели на контролы, а в контролах указатели на обрамляющее их окно. И никакой математики.
0
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 534
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
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2011, 16:16 #57
eugrita, и к чему это? это типо предложение нам решить?
0
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 534
30.07.2011, 16:23 #58
да нет, конечно. Я их сам в свое время решил как халтура для студента. Но теперь только понял, что эта тематика задач похоже относится к обсуждаемой теме. А вы несогласны?
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2011, 16:25 #59
Цитата Сообщение от eugrita Посмотреть сообщение
А вы несогласны?
согласен, только просто странно видить задание в теме, оффтоп получается)
0
30.07.2011, 16:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2011, 16:25

Взаимодействие между классами
Суть проблемы такова: в одном файле classy.h объявлено несколько классов...

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

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


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

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

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