Зачем нужен спецификатор PRIVATE в C++

318
17 декабря 2017, 10:36

Зачем нужен спецификатор private в C++, если по умолчанию итак все функции и переменные являются закрытыми?

Answer 1

Например, потому, что в структуре по умолчанию все функции и поля являются открытыми.

Кроме того, текстовый порядок полей влияет на порядок их инициализации в конструкторе! Поэтому просто так переставлять поля класса нельзя, это может изменить смысл программы.

Пример. Допустим, что мы хотим, чтобы поле len было открытым, а поле data — закрытым.

class MyString
{
  public:
    unsigned len;
  private:
    char* data;
  public:
    MyString(const char* s) :
         len(std::strlen(s)),
         data(new char[len + 1])
    {
        std::memcpy(data, s, len + 1);
    }
    // ...
};

Мы не можем переставить местами len и data, потому что инициализаторы в конструкторе выполняются в том порядке, в котором указаны поля, а не в том порядке, в котором они написаны в коде! А значит, без private не обойтись.

Answer 2

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

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

Нет, пожалуй, все же удобство запоминания на одно ключевое слово меньше не в состоянии перевесить все преимущества, этим ключевым словом предоставляемые, нет? :)

READ ALSO
Лидирующий “0” в std::atoi

Лидирующий “0” в std::atoi

Вот такой код выводит "10" в консоль (VS2017):

264
Объявление функции n переменных

Объявление функции n переменных

Есть число nКак объявить функцию n переменных одного типа? Ситуация примерно такая:

243
Реализация алгоритма COS

Реализация алгоритма COS

Ребят, помогите найти код алгоритма COS(дискретное логарифмирование), очень надо

225
Реализация алгоритма Адлемана [требует правки]

Реализация алгоритма Адлемана [требует правки]

Ребят, помогите, пожалуйста найти код алгоритм Адлемана, очень надо

281