Каковы различия между структурой и классом в C ++?

Как указано Thomas Stjernegaard Jeppesen, вы можете использовать History.js для изменения параметров URL, пока пользователь перебирает ваши ссылки и приложения Ajax.

С тех пор прошло почти год, и History.js рос и стал более стабильным и кросс-браузерным. Теперь его можно использовать для управления состояниями истории в HTML5-совместимом, а также во многих браузерах с поддержкой HTML4. В этой демонстрации Вы можете увидеть пример того, как это работает (а также возможность попробовать свои функциональные возможности и ограничения.

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

Наконец, для подробного объяснения того, какие могут быть проблемы с использованием хэшей (и hashbangs), проверьте эту ссылку Бенджамина Луптона.

417
задан Community 23 May 2017 в 12:26
поделиться

13 ответов

Вы забываете хитрое второе различие между классами и структурами.

Процитировал стандарт (§11.2.2 в C ++ 98 - C ++ 11):

При отсутствии спецификатор доступа для базового класса предполагается общедоступный когда объявлен производный класс struct и private предполагается, когда класс объявлен class .

И просто для полноты, более широко известное различие между class и struct определено в (11.2):

Член класса, определенного с помощью ключевое слово класс являются частными пользователем дефолт. Члены определенного класса с ключевыми словами struct или union по умолчанию являются общедоступными .

Дополнительное отличие: ключевое слово class может использоваться для объявления параметров шаблона, в то время как ключевое слово struct не может использоваться таким образом.

456
ответ дан 22 November 2019 в 23:18
поделиться

Вот хорошее объяснение: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Так, еще раз: в C++ структура идентична классу за исключением того, что у членов структуры есть общедоступная видимость по умолчанию, но у членов класса есть частная видимость по умолчанию.

2
ответ дан nutario 23 May 2017 в 12:26
поделиться

Заключение в кавычки C++ FAQ ,

[7.8], Каково различие между структурой ключевых слов и классом?

участники и базовые классы структуры общедоступны по умолчанию, в то время как в классе, они принимают значение по умолчанию к частному.Примечание: необходимо сделать базовые классы явно общедоступными, частными, или защищенными, вместо того, чтобы полагаться на значения по умолчанию.

Структура и класс иначе функционально эквивалентны.

хорошо, достаточно того писклявого чистого разговора о техно. Эмоционально, большинство разработчиков делает сильное различие между классом и структурой. Структура просто чувствует себя подобно открытой груде битов с очень мало в способе инкапсуляции или функциональности. Класс чувствует себя подобно проживанию и ответственному члену общества с интеллектуальными сервисами, сильным барьером инкапсуляции и четко определенным интерфейсом. Так как это - коннотация, которую уже имеет большинство людей, необходимо, вероятно, использовать ключевое слово структуры, если у Вас есть класс, который имеет очень немного методов и имеет общедоступные данные (такие вещи действительно существуют в хорошо разработанных системах!), но иначе необходимо, вероятно, использовать ключевое слово класса.

158
ответ дан Assaf Lavie 23 May 2017 в 12:26
поделиться

Участники класса являются частными по умолчанию. Участники структуры общедоступны по умолчанию. Помимо этого нет никаких других различий. Также см. этот вопрос .

31
ответ дан Community 23 May 2017 в 12:26
поделиться

По словам Stroustrup в Язык Программирования на C++ :

, Которые разрабатывают Вас, использование зависит от обстоятельств и вкуса. Я обычно предпочитаю использовать struct для классов, которые имеют всю общественность данных. Я думаю о таких классах как "не совсем надлежащие типы, просто структуры данных".

Функционально, нет никакого различия кроме общественности / частное

28
ответ дан crashmstr 23 May 2017 в 12:26
поделиться

Это просто соглашение. Структуры могут быть созданы для хранения простых данных, но позже будут развиваться с добавлением функций-членов и конструкторов. С другой стороны, необычно видеть что-то кроме public: доступ в структуре.

2
ответ дан finnw 23 May 2017 в 12:26
поделиться

СТРУКТУРА является типом Абстрактного типа данных, который делит данный блок памяти согласно спецификации структуры. Структуры особенно полезны в сериализации/десериализации файла, поскольку структура может часто писаться в файл дословно. (т.е. Получите указатель на структуру, используйте макрос РАЗМЕРА для вычисления числа байтов для копирования, затем переместите данные в или из структуры.)

Классы являются другим типом абстрактного типа данных, которые пытаются гарантировать сокрытие информации. Внутренне, может быть множество махинаций, методов, временных переменных, переменных состояния. и т.д. это все используется для представления последовательного API любому коду, который хочет использовать класс.

В действительности, структуры о данных, классы о коде.

Однако действительно необходимо понять, что это просто абстракции. Совершенно возможно создать структуры, которые много походят на классы и классы, которые много походят на структуры. На самом деле самые ранние компиляторы C++ были просто предварительными компиляторами, который переводит код C++ в C. Таким образом эти абстракции являются преимуществом для логического мышления, не обязательно активом к самому компьютеру.

Вне того, что каждый - другой тип абстракции, Классы предоставляют решения загадки именования кода C. Так как у Вас не может быть больше чем одной функции, представленной с тем же именем, разработчики раньше следовали за шаблоном _ (). например, mathlibextreme_max (). Путем группировки API в классы подобные функции (здесь мы называем их "методами") могут группироваться и защищаться от именования методов в других классах. Это позволяет программисту организовывать свой код лучше и повторное использование кода увеличения. В теории, по крайней мере.

10
ответ дан 64BitBob 23 May 2017 в 12:26
поделиться

Не в спецификации, нет. Основное различие находится в ожиданиях программиста, когда они читают Ваш код за 2 года. структуры, как часто предполагается, являются POD. Структуры также используются в шаблонном метапрограммировании при определении типа в целях кроме определения объектов.

4
ответ дан MSalters 23 May 2017 в 12:26
поделиться
  1. члены структуры общедоступны по умолчанию, члены класса являются частными по умолчанию.
  2. наследование По умолчанию для Структуры от другой структуры или класса общедоступно. Наследование по умолчанию для класса от другой структуры или класса является частным.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

Это находится на VS2005.

4
ответ дан melpomene 23 May 2017 в 12:26
поделиться

Еще одна вещь отметить, если Вы обновили приложение прежней версии, которое имело структуры для использования классов, Вы могли бы столкнуться со следующей проблемой:

Старый код имеет структуры, код был очищен и они измененные на классы. Виртуальная функция или два была тогда добавлена к новому обновленному классу.

, Когда виртуальные функции будут в классах тогда внутренне, компилятор добавит дополнительный указатель на данные класса для указания на функции.

то, Как это повредило бы старый унаследованный код, - то, если бы в старом коде где-нибудь структура была очищена с помощью memfill для очистки всего этого к нулям, это затоптало бы дополнительные данные указателя также.

4
ответ дан KPexEA 23 May 2017 в 12:26
поделиться

Единственное другое отличие - наследование классов и структур по умолчанию, которое, что неудивительно, является частным и публичным соответственно.

8
ответ дан Tim Cooper 23 May 2017 в 12:26
поделиться

ISO IEC 14882-2003

9 классов

§3

Структура - это класс, определенный с помощью ключ класса структура ; его члены и базовые классы (пункт 10) по умолчанию общедоступны (пункт 11).

2
ответ дан 22 November 2019 в 23:18
поделиться

Стоит помнить о происхождении C ++ и его совместимости с C.

C имеет структуры, в нем нет концепции инкапсуляции, поэтому все является общедоступным.

Публичность по умолчанию обычно считается плохой идеей при использовании объектно-ориентированного подхода, поэтому при создании формы C, которая изначально способствовала бы ООП (вы можете выполнять ОО на C, но это вам не поможет) идея которого была в C ++ (первоначально «C с классами»), имеет смысл сделать члены по умолчанию закрытыми.

С другой стороны, если бы Страуструп изменил семантику struct так, чтобы ее члены были закрытыми по умолчанию, это нарушило бы совместимость (это уже не так часто, как расходятся стандарты, но все допустимые программы C были также действительными программами C ++, что имело большое влияние на то, чтобы дать C ++ точку опоры).

Таким образом, было введено новое ключевое слово class , которое в точности похоже на структуру, но по умолчанию является закрытым.

Если бы C ++ появился с нуля, без истории, то, вероятно, у него было бы только одно такое ключевое слово. Это также, вероятно, не повлияло бы на то, что произвело.

В общем, люди будут использовать структуры, когда они делают что-то вроде того, как структуры используются в C; открытые члены, без конструктора (пока он не в объединении, вы можете иметь конструкторы в структурах, как и в случае с классами, но люди не склонны), никаких виртуальных методов и т. д.Поскольку языки нужны как для общения с людьми, читающими код, так и для инструктирования машин (иначе мы бы остановились на ассемблере и необработанных кодах операций виртуальной машины), неплохо было бы придерживаться этого.

121
ответ дан 22 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: