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

c++ oop class struct ooad

367688 просмотра

24 ответа

4516 Репутация автора

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

Автор: Alan Hinchcliffe Источник Размещён: 10.09.2008 04:29

Ответы (24)


724 плюса

24091 Репутация автора

Решение

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

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

Автор: Commodore Jaeger Размещён: 10.09.2008 04:35

8 плюса

25692 Репутация автора

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

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

Автор: Andy Размещён: 10.09.2008 04:36

4 плюса

285 Репутация автора

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

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

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

Автор: enigmatic Размещён: 10.09.2008 04:36

21 плюса

1301 Репутация автора

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

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

Автор: mbyrne215 Размещён: 10.09.2008 04:43

7 плюса

4516 Репутация автора

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

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

Автор: Alan Hinchcliffe Размещён: 10.09.2008 04:50

9 плюса

694 Репутация автора

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

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

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

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

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

Автор: argv0 Размещён: 10.09.2008 05:46

-6 плюса

4285 Репутация автора

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

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

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

Например

class PublicInputData {
    //data members
 };
Автор: Baltimark Размещён: 10.09.2008 06:02

53 плюса

82256 Репутация автора

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

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
Автор: Ferruccio Размещён: 10.09.2008 06:08

2 плюса

53152 Репутация автора

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

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

Автор: Javier Размещён: 28.07.2009 03:49

2 плюса

5651 Репутация автора

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

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

Автор: anio Размещён: 28.07.2009 03:51

204 плюса

13008 Репутация автора

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

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

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

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

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

Автор: quark Размещён: 28.07.2009 04:02

34 плюса

5940 Репутация автора

Из C ++ FAQ Lite :

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

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

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

Автор: Tal Pressman Размещён: 28.07.2009 04:07

-4 плюса

946 Репутация автора

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

:(

Автор: GaiusSensei Размещён: 28.07.2009 04:07

0 плюса

331 Репутация автора

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

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

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

Автор: harik Размещён: 28.07.2009 04:29

1 плюс

9234 Репутация автора

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

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

Автор: Maciek Размещён: 28.07.2009 04:42

15 плюса

305 Репутация автора

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

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

    int length() {return x+y+z;}
};
Автор: ogoid Размещён: 28.07.2009 04:13

1 плюс

66974 Репутация автора

Когда вы решите использовать struct и когда использовать класс в 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; }
};
Автор: AraK Размещён: 28.07.2009 08:40

16 плюса

5464 Репутация автора

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

Автор: Adisak Размещён: 27.10.2009 01:50

142 плюса

309294 Репутация автора

Есть много заблуждений в существующих ответах.

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

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

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

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

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

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

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

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

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

class Foo;
struct Bar;

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

и следующие выражения оба имеют значение true:

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

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

Автор: Lightness Races in Orbit Размещён: 28.04.2016 02:17

1 плюс

938 Репутация автора

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

Автор: ivan.ukr Размещён: 15.09.2016 09:30

3 плюса

293 Репутация автора

Учебный класс.

Члены класса по умолчанию закрыты.

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;
};

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

Автор: Frrank Размещён: 07.11.2017 10:41

2 плюса

3459 Репутация автора

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

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

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

Автор: Vorac Размещён: 14.11.2017 09:08

1 плюс

440 Репутация автора

Как уже отмечали другие

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

Существует четкая рекомендация о том, когда использовать какой из Stroustrup / Sutter:

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

Тем не менее, имейте в виду, что не стоит отправлять декларацию. как класс ( class X;) и определить его как struct ( struct X { ... }). Он может работать на некоторых линкерах (например, g ++) и может не работать на других (например, MSVC), так что вы окажетесь в аду разработчиков.

Автор: pasbi Размещён: 17.09.2018 11:05

1 плюс

146 Репутация автора

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

Автор: Helping Bean Размещён: 15.10.2018 04:32
32x32