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

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

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

Во-вторых, для контроля доступа к классу имеет свой собственный прецедент, например, конструктор копирования или оператор =. Было бы сложно реализовать их, если контроль доступа на один экземпляр.

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

862
задан Tamir Vered 28 August 2016 в 15:34
поделиться

19 ответов

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

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

724
ответ дан jperezmartin 28 August 2016 в 15:34
поделиться

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

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

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

, Например,

class PublicInputData {
    //data members
 };
-6
ответ дан Baltimark 28 August 2016 в 15:34
поделиться

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

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

7
ответ дан Alan Hinchcliffe 28 August 2016 в 15:34
поделиться

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

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

8
ответ дан Andy 28 August 2016 в 15:34
поделиться

Структуры ( ПЕРЕХОДНЫЕ ПРИСТАВКИ , в более общем плане) удобны, когда Вы предоставляете интерфейсу C-compatible реализацию C++, так как они являются портативными через границы языка и форматы компоновщика.

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

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

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

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

9
ответ дан Deduplicator 28 August 2016 в 15:34
поделиться

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

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

21
ответ дан start2learn 28 August 2016 в 15:34
поделиться

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

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
53
ответ дан Ferruccio 28 August 2016 в 15:34
поделиться

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

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

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

4
ответ дан enigmatic 28 August 2016 в 15:34
поделиться

И struct и class то же под капотом, хотя с различными значениями по умолчанию относительно видимости, struct значение по умолчанию общедоступно и class, значение по умолчанию является частным. Можно изменить любой, чтобы быть другим с соответствующим использованием private и public. Они оба позволяют наследование, методы, конструкторов, деструкторы и всю остальную часть положительных героев объектно-ориентированного языка.

Однако одна огромная разница между этими двумя - то, что struct, поскольку ключевое слово поддерживается в C, тогда как class не. Это означает, что можно использовать struct во включать файле, который может быть #include или в C++ или в C, пока эти struct простой стиль C struct, и все остальное во включать файле совместимо с C, т.е. никаким C++ определенные ключевые слова такой как [1 112], public, никакие методы, никакое наследование, и т.д. и т.д. и т.д.

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

А C стиль struct является своего рода шаблоном (не шаблон C++, а скорее шаблон или шаблон), который описывает расположение области памяти. За эти годы интерфейсы, применимые от C и с плагинами C (здесь смотрит на Вас Java и Python и Visual Basic), были созданы, некоторые из которых работают со стилем C struct.

0
ответ дан 22 November 2019 в 21:03
поделиться

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

: (

-4
ответ дан 22 November 2019 в 21:03
поделиться

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

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

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

0
ответ дан 22 November 2019 в 21:03
поделиться

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

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

// '()' 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
ответ дан 22 November 2019 в 21:03
поделиться

Технически оба они одинаковы в 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;
};

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

1
ответ дан 22 November 2019 в 21:03
поделиться

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

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

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

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

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

    int length() {return x+y+z;}
};
15
ответ дан 22 November 2019 в 21:03
поделиться

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

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

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

Из C ++ FAQ Lite :

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

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

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

35
ответ дан 22 November 2019 в 21:03
поделиться

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

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

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

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

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

используйте класс es. В остальном разница между двумя приведенными ниже фрагментами бессмысленна:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

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

используйте класс es. В остальном разница между двумя приведенными ниже фрагментами бессмысленна:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

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

214
ответ дан 22 November 2019 в 21:03
поделиться

Вы можете использовать "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 ++, но это упрощенный пример.

17
ответ дан 22 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

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