Может ли быть два открытых раздела в классе? Если да, то почему? И в каких обстоятельствах мы это делаем?
Есть что-то, что подтачивает меня по классам. Например
class A
{
public:
A()
{
.....
.....
}
void cleanup()
{
....
....
....
}
public:
UINT a;
ULONG b;
};
В приведенном выше примере есть два открытых раздела. В первом разделе я определяю конструктор и метод, а во втором разделе я объявляю члены данных. Является ли вышеуказанный класс точным. Можем ли мы это сделать? Если да, то почему это необходимо и в каких обстоятельствах мы должны его использовать? Поскольку мы можем сделать все в одном разделе, то почему существуют два раздела?
Ответы
Ответ 1
Квалификаторы доступа просто применяются к следующему коду до следующего квалификатора. Нет ограничений на количество или порядок таких квалификаторов.
Как правило, нет необходимости повторять один и тот же квалификатор доступа в классе, и это может смутить читателя. Они также могут влиять на макет класса, поскольку члены данных, следуя одному и тому же определителю, должны быть выложены в том порядке, в котором они объявлены, но таких ограничений между квалификаторами нет.
Ответ 2
Как говорит Марсело, вы можете использовать публичные, частные и защищенные отборочные команды столько раз, сколько пожелаете. "Когда" полностью личный. Некоторым нравится:
class AClass
{
public:
// all the public stuff
protected:
// all the protected stuff
private:
// all the private stuff
};
но лично (и это действительно личное предпочтение) Мне нравится делать это:
class AClass
{
// constructors and destructors
public:
// public cons/dest
protected:
// protected cons/dest
private:
// private cons/dest
// accessors
public:
protected:
private:
// methods
public:
protected:
private:
// members
public:
protected:
private:
};
Не стесняйтесь придумывать свой стиль, независимо от того, с чем вам удобно. Нет правильного или неправильного способа сделать это. Просто старайтесь быть последовательными.
Ответ 3
Да, его правильно, однако, лично я предпочитаю иметь только один открытый раздел в верхней части класса, где программисты смотрят сначала при изучении нового класса. Затем легче увидеть, какие части должны быть доступны, а какие нет - вместо просмотра всего заголовка класса.
Ответ 4
Класс правильный, public - это только квалификатор доступа и будет применяться до тех пор, пока не появится следующий квалификатор или конец объявления класса. Нет ограничений на то, сколько из этих квалификаторов доступа (публичных, частных, защищенных) вы можете иметь в классе. Что касается того, почему это полезно, это помогает писать объявления классов так, как вы хотите. Например, мне могут потребоваться все функции-члены (public, protected или private), объявленные перед (скажем) частными членами данных.
Ответ 5
Как объясняет @Marcelo Cantos, это разрешено. При написании кода вы должны избегать этого, поскольку это только приводит к путанице, когда другие читают ваш код. Единственное место, которое я когда-либо видел в реальной жизни, - это код, созданный различными мастерами MFC. Всякий раз, когда вы добавляете что-то в свой класс с помощью мастера, он просто добавляет дополнительный раздел в конец вашего класса.
Ответ 6
Обычно я пытаюсь упорядочить объявление класса, чтобы другим было проще использовать указанный класс.
Обычным является, таким образом, public/protected/private
, в этом порядке, потому что это упрощает жизнь для читателей.
- Люди, которые используют класс, могут перестать читать один раз, дойдя до тега
protected
, ничто после него не беспокоит.
- Люди, которые производятся от класса, могут перестать читать один раз, достигнув тега
private
, что-либо после детализации реализации.
Это, в сочетании с не написанием кода методов в их точке деклараций, упрощает чтение.
Однако есть несколько трюков:
- при использовании программирования метатемов вам может потребоваться сначала объявить типы, потом методы, поэтому вы получите 2 серии
public/protected/private
- при использовании ключевой идиомы (вместо
friend
) у вас есть раздел public
, который фактически предназначен только для небольшой части пользователей и лучше всего изолирован либо в нижней части обычного public
или после раздела protected
.
Наконец, чтобы прокомментировать проблему макет среди атрибутов. Инкапсуляция означает, что атрибуты должны быть private
. Таким образом, либо у вас есть struct
, и все public
, либо у вас есть класс, а все - private
, смешивая два способа взлома инкапсуляции и что ошибка в создании.