C / C++ Struct vs Class



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



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



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

529   6  

6 ответов:

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

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

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

другое, что различия в доступе по умолчанию (public/private), нет никакой разницы.

однако некоторые магазины, которые кодируют в C и c++, будут использовать "class / struct" для указания того, что может использоваться в C и C++ (struct) и которые являются только C++ (class). Другими словами, в этом стиле все структуры должны работать с C и C++. Вот почему была разница в первую очередь давно, когда C++ все еще был известен как "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

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

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

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

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

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

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

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

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

принуждение

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

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

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

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

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

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

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

Comments

    Ничего не найдено.