Является ли частный const избыточным в классе C ++? - PullRequest
0 голосов
/ 11 мая 2018

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

Private:

class ConstFoo
{
public:
    Foo(int a);
    virtual ~Foo();
    int val(){ return val_; }
private:
    int val_;
}

Private Const:

class ConstFoo
{
public:
    Foo(int a);
    virtual ~Foo();
    int val(){ return val_; }
private:
    const int val_;
}

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

Одна из причин, по которой яМожно видеть, что добавление const явно для ясности кода, поэтому люди, работающие над кодом в будущем, не добавят установщик в функцию.Тем не менее, с именем ConstFoo и документацией, в которой конкретно указано, что оно не предназначено для изменчивости, я не думаю, что это будет проблемой.

Ответы [ 5 ]

0 голосов
/ 12 мая 2018

Ключевое слово private гарантирует, что никто за пределами класса не сможет изменить переменную.

Если вы не измените переменную внутри класса, результат будет таким же.

КакПо моему мнению, лучше использовать клавиатуру const, потому что она не только сообщает разработчикам (включая вас), что может изменить ваш класс, чтобы он оставался постоянным, но и более безопасна: если они пытаются изменитьмодификация не будет иметь эффекта.

Так что, на мой взгляд, она не является избыточной.

0 голосов
/ 11 мая 2018

Вы в значительной степени ответили на него сами: его настройка const очень четко выражает ваше намерение и дает компилятору возможность поддержать вас.

По моему скромному мнению, ключевое слово constслужит двум целям:

A) Это показывает намерение программистов, что это значение не должно изменяться после его установки,

B) Это позволяет компилятору реализовать это намерение, предотвращая ошибки.

Называя его constFoo в некоторой степени достигает первого из них, но ничего не делает для второго.И (опять же ИМХО) значительно уродливее, чем использование const.

0 голосов
/ 11 мая 2018

Все зависит от того, насколько "const" вы хотите, чтобы это значение было.

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

ConstFoo a{0};
ConstFoo b{2};
a = b;

a теперь имеет 2 в нем.

Плюс, код в пределах ConstFoo тоже может изменить свое значение;Вот почему оператор присваивания копии может изменить свое значение.

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

Конечно, это делает ConstFoo не присваиваемым.

0 голосов
/ 11 мая 2018

Не уверен, если я правильно понял ваш вопрос, но в целом:

  • Доступ к закрытым членам возможен только из самого класса, тогда как к открытым членам можно получить доступ извне
  • члены const могут быть установлены только один раз внутри конструктора при создании нового объекта этого конкретного класса

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

Также, вообще говоря, вы совершенно правы, вся концепция использования констант в C ++ заключается в том, чтобы убедиться, что ваши ограничения соблюдаются в дальнейшем.процесс разработки (не только другими разработчиками, но и вами)

0 голосов
/ 11 мая 2018

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

void bar() { val_ = 42; }

Тогда ваш первый блок кода скомпилируется, а второй выдаст вам ошибку. Если вы действительно не хотите иметь возможность изменять значение члена, тогда оно должно быть const независимо от того, является ли оно частным или нет. Это const станет для вас средством проверки ошибок.

...