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

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

24 ответов


различия между class и struct в C++ есть, что структуры имеют default public члены, базы и классы имеют значение по умолчанию private участники и базы. Классы и структуры могут иметь смесь public, protected и private члены, могут использовать наследование и могут иметь функции-члены.

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


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

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

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

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

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


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

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

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

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

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

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

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

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

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

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

class Foo;
struct Bar;

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

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

std::is_class<Foo>::value
std::is_class<Bar>::value

обратите внимание, что вы не можете переключать ключевые слова, когда переиначивая; это только потому, что (в соответствии с правилом одного определения) повторяющиеся определения классов в единицах перевода должны "состоят из той же последовательности токенов". Это означает, что вы даже не можете обменять const int member; С int const member;, и не имеет ничего общего с семантикой class или struct.


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

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

с C++ FAQ Lite:

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

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

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


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

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, но я нахожу, что накладные расходы на декодирование сообщения в класс обычно не стоят того.


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

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

// Put your C struct's 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

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


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

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

    int length() {return x+y+z;}
};

структуры (РМО, в более общем плане) удобны, когда вы предоставляете c-совместимый интерфейс с реализацией c++, поскольку они переносимы через языковые границы и форматы компоновщика.

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

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

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

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


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

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


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

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


Они в значительной степени то же самое. Благодаря магии C++ структура может содержать функции, использовать наследование, создаваться с помощью " new " и так далее, как класс

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

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


класса.

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

class test_one {
    int main_one();
};

эквивалентно

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

так что, если вам попробовать

int two = one.main_one();

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

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

структура.

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

struct test_one {
    int main_one;
};

означает main_one частный т. е.

class test_one {
  public:
    int main_one;
};

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


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

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


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

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


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

однако :

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

надеюсь, что это помогает.

#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...() методы здесь - наслаждайтесь.


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

Я использую 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; }
};

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


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

вот еще одна причина для использования только struct и не class. Некоторые рекомендации по стилю кода для C++ предлагают использовать маленькие буквы для макросов функций, обосновывая это тем, что при преобразовании макроса во встроенную функцию имя не должно изменяться. Здесь же. У тебя есть ... хорошая структура C-стиля и однажды вы узнаете, что вам нужно добавить конструктор или какой-то удобный метод. Вы меняете его на class? Везде?

различие между structs и classes просто слишком много хлопот, попадая на пути делать то, что мы должны делать - Программирование. Как и многие проблемы C++, он возникает из-за сильного желания обратной совместимости.


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

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

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


Я бы рекомендовал не смешивать structs и classes.

если

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

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

если вы вперед объявляете sth. как class X; и позже определил его как struct X { ... } он может работать на некоторых компоновщиках (например, g++) и может потерпеть неудачу на других (например, MSVC), поэтому вы окажетесь в аду разработчика. Как нет причин смешивать struct и class, почему нужно делать мысли более сложными и заботиться о том, была ли эта вещь class или struct?


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

: (


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

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

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

Э. Г.

class PublicInputData {
    //data members
 };

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