Когда вы должны использовать класс vs struct в С++?

В каких сценариях лучше использовать struct vs a class в С++?

+638
источник поделиться
23 ответа

Различия между class и a struct в С++ заключаются в том, что структуры имеют по умолчанию элементы public, а базы и классы по умолчанию имеют private члены и базы. Оба класса и структуры могут иметь смесь членов public и private, могут использовать наследование и могут иметь функции-члены.

Я бы рекомендовал использовать структуры как структуры с простыми старыми данными без каких-либо классов и использовать классы как совокупные структуры данных с данными private и функциями-членами.

+559
источник

Как отмечают все остальные, действительно существуют только две фактические языковые различия:

  • struct по умолчанию используется открытый доступ, а class - к закрытому доступу.
  • При наследовании struct по умолчанию используется значение public наследования и class по умолчанию - private наследование. (По иронии судьбы, как и в С++, значение по умолчанию - назад: public Наследование является гораздо более распространенным выбором, но люди редко объявляют struct просто для сохранения при вводе ключевого слова public.

Но реальная разница на практике находится между a class/struct, который объявляет конструктор/деструктор, а другой - нет. Существуют определенные гарантии для типа POD типа "простой-старый", который больше не применяется после того, как вы перейдете к конструкции класса. Чтобы это различие было ясным, многие люди сознательно используют struct для типов POD, и, если они вообще собираются добавлять какие-либо методы, используйте class es. Различие между двумя фрагментами ниже в противном случае бессмысленно:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Кстати, здесь поток с некоторыми хорошими объяснениями о том, что на самом деле означает тип POD: Что такое типы POD в С++?)

+149
источник
другие ответы

Связанные вопросы


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

В существующих ответах есть много неправильных представлений.

Оба class и struct объявляют класс.

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

Но, помимо синтаксиса, единственной причиной выбора одного над другим является соглашение/стиль/предпочтение.

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

Аналогично, некоторым людям нравится использовать ключевое слово class для классов с функциями-членами и private данными, потому что оно говорит "class" на нем и поэтому выглядит как примеры из их любимой книги по объектно-ориентированному программированию.

Реальность заключается в том, что это полностью зависит от вас и вашей команды, и это буквально не будет иметь никакого отношения к вашей программе.

Следующие два класса абсолютно эквивалентны во всех отношениях, кроме их имени:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Вы можете даже переключать ключевые слова при обновлении:

class Foo;
struct Bar;

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

а следующие выражения оцениваются как true:

std::is_class<Foo>::value
std::is_class<Bar>::value
+57
источник

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

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
+49
источник

Из С++ FAQ Lite:

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

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

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

+30
источник

Одно место, где была полезно для меня структура, - это когда у меня есть система, которая получает сообщения с фиксированным форматом (например, последовательный порт) из другой системы. Вы можете передать поток байтов в структуру, которая определяет ваши поля, а затем легко получить доступ к полям.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Очевидно, что это то же самое, что вы делали бы на C, но я нахожу, что накладные расходы на необходимость декодирования сообщения в классе обычно не стоит.

+16
источник

Вы можете использовать "struct" в С++, если вы пишете библиотеку, внутри которой С++, но API можно вызвать либо с помощью кода C, либо с С++. Вы просто создаете один заголовок, который содержит структуры и глобальные функции API, которые вы открываете для кода C и С++ следующим образом:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

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

+13
источник

Структуры (PODs, в более общем плане) удобны, когда вы предоставляете C-совместимый интерфейс с реализацией С++, re переносится через границы языка и форматы компоновщика.

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

Структуры также удобны для различных задач метапрограммирования, таких как шаблоны шаблонов, которые просто выставляют кучу зависимых typedefs:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

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

+7
источник

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

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};
+7
источник

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

Тем не менее, я склонен использовать структуры на С++, как в С#, подобно тому, что сказал Брайан. Структуры представляют собой простые контейнеры данных, в то время как классы используются для объектов, которые должны воздействовать на данные, а не просто на них.

+5
источник

Чтобы ответить на мой собственный вопрос (бесстыдно), Как уже упоминалось, привилегии доступа являются единственной разницей между ними в С++.

Я использую только структуру для хранения данных. Я позволю ему получить несколько вспомогательных функций, если это облегчит работу с данными. Однако, как только данные требуют управления потоком (т.е. Геттеры/сеттеры, которые поддерживают или защищают внутреннее состояние), или начинают использовать любую основную функциональность (в основном более объектно-подобную), она будет "обновлена" до класса, чтобы лучше общаться с намерениями.

+3
источник

Это почти то же самое. Благодаря магии С++ структура может содержать функции, использовать наследование, созданные с использованием "новых" и т.д., Как класс

Единственное функциональное отличие состоит в том, что класс начинается с прав доступа к частному доступу, а структура начинается с публики. Это поддержка обратной совместимости с C.

На практике я всегда использовал структуры как держатели данных и классы как объекты.

+2
источник

они одинаковы с разными значениями по умолчанию (частные по умолчанию для class и public по умолчанию для struct), поэтому в теории они полностью взаимозаменяемы.

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

+2
источник

Структуры по умолчанию имеют открытый доступ, а классы по умолчанию имеют закрытый доступ.

Лично я использую structs для объектов передачи данных или как объекты Value. При использовании как таковой я объявляю всех членов как const, чтобы предотвратить изменение другим кодом.

+2
источник

Когда вы решите использовать struct и когда использовать класс в С++?

Я использую struct, когда я определяю functors и POD. В противном случае я использую class.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};
+1
источник

Класс.

По умолчанию члены класса являются закрытыми.

class test_one {
    int main_one();
};

Является эквивалентным

class test_one {
  private:
    int main_one();
};

Итак, если вы попробуете

int two = one.main_one();

Мы получим сообщение об ошибке: main_one is private, потому что он недоступен. Мы можем разрешите его, инициализируя его, указав его публичный, т.е.

class test_one {
  public:
    int main_one();
};

Struct.

Структура - это класс, в котором члены общедоступны по умолчанию.

struct test_one {
    int main_one;
};

Значения main_one являются частными, т.е.

class test_one {
  public:
    int main_one;
};

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

+1
источник

Я использую struct только тогда, когда мне нужно хранить некоторые данные без каких-либо связанных с ним функций-членов (для работы с данными-членами) и для прямого доступа к переменным данных.

Например: Чтение/запись данных из файлов и потоков сокетов и т.д. Передача аргументов функции в структуре, где слишком много аргументов функции, а синтаксис функций слишком длинный.

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

0
источник

Технически оба одинаковы в С++ - например, возможно, что у структуры есть перегруженные операторы и т.д.

Однако:

Я использую структуры, когда хочу передавать информацию нескольких типов одновременно Я использую классы, когда я имею дело с "функциональным" объектом.

Надеюсь, что это поможет.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

Например, я возвращаю студента структуры в методах get...() здесь - наслаждайтесь.

0
источник

Я использую structs, когда мне нужно создать POD-тип или функтор.

0
источник

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

0
источник

Я думал, что Structs был предназначен как структура данных (например, массив данных типа нескольких данных), а классы были включены в Code Packaging (например, коллекции подпрограмм и функций).

: (

-2
источник

Я никогда не использую "struct" в С++.

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

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

например.

class PublicInputData {
    //data members
 };
-4
источник

Функции доступа - это не единственная разница между структурами и классами. Структура лучше для типов POD (Plain Old Data), поскольку для компилятора и программиста проще управлять. Для новичков, которые не используют объектно-ориентированное программирование, использование структуры в порядке.

-7
источник

Посмотрите другие вопросы по меткам или Задайте вопрос