Другие указали правильно, что в C++ ключевые слова struct
и class
имеют то же значение, за исключением различий в видимости элементов.
Независимо от того, называете ли вы совокупные типы, определенные таким образом «структуры» или «классы» или «weiruewzewiruz», зависит от вас. В интересах коммуникации, как правило, рекомендуется придерживаться установленных конвенций, поэтому я бы посоветовал «weiruewzewiruz».
Также рекомендуется использовать семантические различия в качестве ориентира для выбора слов. Использование struct
более распространено для простых агрегированных данных, которые не имеют много внутренней логики и инвариантов; типичным применением будет struct point { float x; float y; };
. Такие типы часто называют «структурами» или «структурами» в литературе. Не удивительно, если кто-то, использующий fprintf
в C++, ссылался на первый аргумент как «указатель на структуру FILE». FILE является примером того, что означает Скотт Мейерс в „более эффективные C++“, пункт 34:
Безопасно предположить, что определение структуры, которая составляет в обоих языках [C и C++ -pas] уложен аналогичным образом оба компилятора.
Что касается естественного языка, выбор слова «структура» не случайна: Meyers говорит о простом старом агрегате данных, который имеет одинаковую семантику на обоих языках, вплоть до уровня бит.
Что касается языка программирования, не имеет значения, использовало ли в C++ определение совокупности данных ключевое слово struct
или class
(с указателем общего доступа). struct
, пожалуй, более естественный выбор, поскольку семантика C++ совокупности является семантикой структуры C. Кроме того, использование struct
позволяет как C, так и C++ источникам упростить совместное использование одного определения типа.
Стандарт C++ использует «структуру» и «структуру» как на естественном языке, так и на языке программирования не только в случаях совместимости: 1.7/5: «Структура, объявленная как», или 3.2/4 struct X; // declare X as a struct type
. Самое интересное, 9/8, заложив основу для-критериев-взаимодействия:
8 Стандарт-макет структура представляет собой класс стандартного макета определяется класс-ключ или структура класса ключ класса. [...]
Как никто, кто читает это, может утверждать, что в C++ нет структур, которые находятся вне меня. Это явно не ошибка редактирования, поскольку термины «struct» и «class» явно заданы относительно друг друга.
Более интересные, чем выбор слов и вопросы вкуса, однако, являются явными, проверяемыми различиями. При каких обстоятельствах совокупность C++ сопоставима и совместима с C struct
? Возможно, этот вопрос лежал в основе вашего вопроса? Стандартная компоновка, упомянутая в цитате, является критерием. Это подробно описано в 9/7 и в основном предусматривает, что
- только один класс в иерархии наследования может иметь нестатические определения членов данных (возможно, потому, что стандарт не хочет, чтобы определить порядок элементов данных, определенный на различном уровни в такой иерархии);
- не разрешены виртуальные или виртуальные базовые классы (из-за дополнительных данных экземпляра, необходимых для информации о времени выполнения);
- все члены имеют тот же «контроль доступа» (открытый, защищенный или закрытый, вероятно, потому, что реализация может быть заказана путем контроля доступа).
Стандарт затем говорит
9 [Примечание: классы Standard верстки полезны для общения с кодом, написанным на других языках программирования. Их компоновка указана в 9.2.-концевой ноты]
Конечно определение структура, которая составляет в C удовлетворяет этим критериям, следовательно, утверждение Скотт Мейерс. FILE
от stdio.h - выдающийся, не совсем тривиальный пример. Обратите внимание, что стандарт не гарантирует гарантии, поскольку макет объекта зависит от реализации и может изменяться только с помощью параметра компилятора.
Можно ли проверить класс стандартного макета с типом черты std::is_standard_layout<T>
. Следующая программа, вдохновленная an example on cppreference, проверяет основные случаи, изложенные в стандарте.
#include <cstdio>
#include <typeinfo>
#include <type_traits>
using namespace std;
struct funcOnlyT // fine
{
int f();
};
class podT { // "class" is ok
int m1;
int m2;
};
struct badAccessCtrlT { // bad: public/private
int m1;
private:
int m2;
};
struct polymorphicT { // bad: polymorphic
int m1;
int m2;
virtual void foo();
};
struct inheritOkT: podT // ok: inheritance, data only on one level
{
int f();
};
struct inheritPlusDataT: podT // bad: inheritance, data on 2 levels
{
int m3;
};
template<typename T1, typename T2>
struct templT // ok with std layout types T1, T2
{
T1 m1;
T2 m2;
};
// print type "name" and whether it's std layout
template<typename T>
void printIsStdLayout()
{
printf("%-20s: %s\n",
typeid(T).name(),
std::is_standard_layout<T>::value
? "is std layout"
: "is NOT std layout");
}
int main()
{
printIsStdLayout<funcOnlyT>();
printIsStdLayout<podT>();
printIsStdLayout<badAccessCtrlT>();
printIsStdLayout<polymorphicT>();
printIsStdLayout<inheritOkT>();
printIsStdLayout<inheritPlusDataT>();
printIsStdLayout<templT<int, float> >();
printIsStdLayout<FILE>();
}
Пример сеанса:
$ g++ -std=c++11 -Wall -o isstdlayout isstdlayout.cpp && ./isstdlayout
9funcOnlyT : is std layout
4podT : is std layout
14badAccessCtrlT : is NOT std layout
12polymorphicT : is NOT std layout
10inheritOkT : is std layout
16inheritPlusDataT : is NOT std layout
6templTIifE : is std layout
9__sFILE64 : is std layout
Структуры и классы не являются «почти одинаковыми»; они на самом деле точно такие же * тип вещи *, но они имеют два разных * синтаксических представления * с разными * стандартными * режимами доступа. В объявлении типа, которое делает все спецификаторы доступа явным, то есть '(struct | class) MyClass: public BaseClass {private: ....', есть * no * разница между 'struct' и' class'. –
Очень рекомендуемый [выбранный ответ] (http://stackoverflow.com/a/34108140/464581) - это просто неправильно, дезинформация. Теперь есть два правильных ответа: один короткий и один длинный. Выберите правильный ответ, чтобы читатели, приезжающие сюда через Google, не были полностью введены в заблуждение и дезинформированы. –
@ Cheersandhth.-Alf: Что вы утверждаете, это неправильно? Вы говорите, что C++ имеет понятие «структура», которое на самом деле является отдельным и отличным от понятия «класс»? Или вы утверждаете, что ответ должен сказать, что структуры и классы - это то же самое, что и два ключевых слова, чтобы объявить их, вместо того, чтобы говорить, что структуры не являются вещью на C++? Или у вас есть другие проблемы? – user2357112