C / C ++ Struct против класса - PullRequest
103 голосов
/ 01 мая 2010

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

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

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

Ответы [ 6 ]

138 голосов
/ 01 мая 2010

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

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

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

14 голосов
/ 01 мая 2010

Кроме различий в доступе по умолчанию (публичный / приватный), разницы нет.

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

6 голосов
/ 14 октября 2016

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

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

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

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

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

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

Исполнение

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

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

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 хорошо работают для членов, которые, например, являются производными друг от друга или взаимосвязаны. Они также могут помочь с проверкой работоспособности при создании экземпляра. Struct хорошо работают для того, чтобы иметь «мешки с данными», где на самом деле ничего особенного не происходит, но члены логически имеют смысл объединяться в группы.

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

6 голосов
/ 01 мая 2010

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

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

3 голосов
/ 12 сентября 2012

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

1 голос
/ 01 мая 2010

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

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