Я убиваю котенка каждый раз, когда использую struct везде вместо класса? - PullRequest
7 голосов
/ 24 января 2011

struct является общедоступным по умолчанию, а class является частным по умолчанию.

Давайте возьмем, к примеру, Ogre3D; если я изменяю все class вхождения с помощью struct, она компилируется (я полагаю), и движок работает так же, как и раньше.

Если я прав, скомпилированный код точно такой же, как и раньше, потому что только компилятор проверяет, вызваны ли закрытые / защищенные методы, он не проверяется во время выполнения.

Если я все еще прав, class - это просто ключевое слово, которое просто радует глаз и просит: «Пожалуйста, инкапсулируйте свои данные: вы спасете котенка», в то время как частные / защищенные области все еще остаются за пользователем. .

Я знаю, что звучит как-то неубедительно или неуместно бунтовать (что-то вроде "С, ЧЕЛОВЕК, ПОЦЕЛУЙ, не уходи"

Возвращаясь к вопросу: что стандарт говорит об этой небольшой разнице между struct и class при генерации машинного кода? Зачем добавлять ключевое слово и пытаться поразить программистов так называемой «ОО-моделью», тогда как тогда она полностью не применяется? Это было под влиянием Java?

Ответы [ 10 ]

5 голосов
/ 24 января 2011

Стандарт вообще ничего не говорит о генерации машинного кода.

struct было сохранено, чтобы упростить миграцию старого кода C. Как правило, программисты на C ++ используют его для POD-подобных структур.

4 голосов
/ 24 января 2011

На самом деле, class и struct проверяются во время компиляции. Единственное отличие состоит в том, являются ли значения по умолчанию для пользователей, для которых вы явно не указали доступ, public (для struct) или private (для class). В противном случае они производят точно такие же объекты. Если вы явно укажете все элементы управления доступом, вы можете использовать любой из них, и они будут одинаковыми.

2 голосов
/ 24 января 2011

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

Не

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

struct a {
   int a;
private:
   int b:
};
class b {
   int a;
public:
   int b;
};

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

2 голосов
/ 24 января 2011

Нет.Разница между struct и class ограничена доступностью по умолчанию их членов и наследованием.Оба public для struct и private для class

2 голосов
/ 24 января 2011

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

class X;

X* pX;

struct X {};

И он должен скомпилироваться.

1 голос
/ 24 января 2011

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

На мой взгляд, это серьезная ошибка, и всепричины, о которых я слышал, ошибочны.Во-первых, ключевое слово типа struct недостаточно для выражения условий, которые они пытаются использовать для документирования.Поскольку ключевое слово на самом деле ничего не значит, люди либо соглашаются с этим, либо пытаются утверждать, что оно должно означать.Существует слишком много несовместимых мнений о том, что struct должно означать в коде, чтобы оно могло документировать любое из них.Вы хотите документировать такие вещи, как «Этот объект всегда должен быть POD», настолько четко, насколько это возможно, вместо того, чтобы полагаться на неясные стандартные детали команды, которые трудно запомнить.Таким образом, для документирования такой вещи, честно говоря, достаточно всего лишь // This object must always be a POD.Это ясно, просто и не может быть неправильно истолковано любым, кто знает, что такое POD, и это хорошо определено.

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

То, что вы решите, будет довольно произвольным.Причины могут быть позже утверждены, но я считаю, что людей, которые выбрали одно или другое, нелегко убедить.Я переключился с 'class' на 'struct', потому что я прочитал слишком много книг по современному C ++ и слишком много буст-кода;вы редко увидите ключевое слово 'class' в обоих.По правде говоря, это не имеет значения;Следуйте стандартам команды, в которой вы находитесь.По моему мнению, добавление ключевого слова, которое по сути бессмысленно, было ошибкой.

Редактировать: Хотя я должен сказать, что еще одна причина, по которой я не люблю использовать class, заключается в том, что оно означает слишком много вещей, даже еслиничего не значит конкретно.Например, вы можете использовать class вместо typename в спецификациях параметров шаблона.Даже если вы используете ключевое слово class, вы можете передавать любой тип, но не обязательно какой-либо класс (например, int).Единственное время, когда мне нравится использовать ключевое слово class, это когда оно действительно что-то значит и где вам действительно необходимо: указание параметров шаблона шаблона.

1 голос
/ 24 января 2011

Нет, это определенно не было под влиянием Java.Проверьте сроки.:)

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

1 голос
/ 24 января 2011

Единственное различие между структурами и классами в C ++ состоит в том, что классы по умолчанию имеют закрытые члены и базовые классы.Обычно изменение class на struct не должно влиять на сгенерированный машинный код.

0 голосов
/ 24 января 2011

Хм, теперь ... Если вы когда-нибудь разместите такую ​​программу в публичном пространстве, скажем что-то вроде OSS, люди будут бросать в вас камни;)

Ключевое слово struct является своего рода наследием языка Си. И да, единственное отличие (насколько я помню) - поведение по умолчанию в отношении защищаемых членов.

Бьярн Страуструп в "Языке программирования C ++":

По определению структура - это класс, члены которого по умолчанию являются открытыми; то есть

struct s {...

это просто сокращение для

class s {public: ...

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

0 голосов
/ 24 января 2011

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

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