C/С++ Struct vs Class

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

Я никогда не программировал на C раньше; но я знаю, что у него есть структуры. В C можно ли наследовать другие структуры и установить модификатор public/private?

Если вы можете сделать это в обычном C, почему в мире нам нужен С++? Что отличает классы от структуры?

Ответ 1

В С++ структуры и классы практически одинаковы; единственная разница заключается в том, что, когда модификаторы доступа (для переменных-членов, методов и базовых классов) в классах по умолчанию являются частными, модификаторы доступа в структурах по умолчанию публикуются.

Однако в C структура представляет собой всего лишь совокупный набор (общедоступных) данных и не имеет других функций класса: никаких методов, никакого конструктора, базовых классов и т.д. Хотя С++ унаследовала ключевое слово, оно расширилось семантика. (Это, однако, то, почему вещи по умолчанию публично в structs - структура, написанная как структура C, ведет себя как одна.)

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

Ответ 2

Другое, что различия в доступе по умолчанию (общедоступные/частные) не отличаются.

Однако некоторые магазины, которые набирают код на C и С++, будут использовать "class/struct", чтобы указать, что может использоваться в C и С++ (struct) и которые являются только С++ (класс). Другими словами, в этом стиле все структуры должны работать с C и С++. Вот почему, в первую очередь, была разница в прошлом, когда С++ все еще назывался "C с классами".

Обратите внимание, что C-соединения работают с С++, но не наоборот. Например

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

И аналогично

typedef union friend{
    int a;
    float b;
} class;

работает только в C

Ответ 3

Невозможно определить функции-члены или вывести структуры друг из друга в C.

Кроме того, С++ - это не только C + "выводимые структуры". Шаблоны, ссылки, пользовательские пространства имен и перегрузка оператора все не существуют в C.

Ответ 4

Еще одно отличие в С++, когда вы наследуете класс от структуры без какого-либо спецификатора доступа, оно становится общепринятым наследованием, где, как и в случае класса, это частное наследование.

Ответ 5

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

Вот соответствующий раздел из рекомендаций:

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

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

Если все члены данных могут меняться независимо друг от друга, инвариант невозможен.

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

Исполнение

Ищите структуры со всеми данными private и классы с открытыми членами.

Приведенные примеры кода:

struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

Class es хорошо работают для членов, которые, например, производятся друг от друга или взаимосвязаны. Они также могут помочь с проверкой работоспособности при создании экземпляра. Struct работают хорошо для наличия "мешков данных", где ничего особенного не происходит, но члены логически имеют смысл группироваться вместе.

Из этого следует, что Class es существуют для поддержки инкапсуляции и других связанных концепций кодирования, что Struct просто не очень полезны для.

Ответ 6

С++ использует структуры в первую очередь для 1) обратной совместимости с C и 2) типами POD. Структуры C не имеют методов, наследования или видимости.