const (c ++) является необязательным? - PullRequest
4 голосов
/ 19 марта 2010

В соответствии с некоторыми уроками, которые я читал некоторое время назад, объявление "const" делает переменную "константой", то есть она не может измениться позже.
Но я нахожу это const-объявление abit неудобным, поскольку компилятор иногда выдает ошибки типа
"cannot convert const int to int"
или что-то типа того.

и я все равно обманываю, удаляя его.

вопрос: предполагая, что я стараюсь не менять переменную в моем исходном коде , могу ли я с радостью забыть об этом const?

Заранее спасибо

Ответы [ 11 ]

0 голосов
/ 19 марта 2010

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

const double PI = 3.14159265358979;

PI=4; // generates a compiler error (good)

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

class A {
private:
  const int num;
public:
  A(int x, int y) : num(0) { // oops, I don't yet know what num should be
    while ( ... ) {

    }
    num = ...;
  }
};

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

class A {
private:
  const int num;
  int computeNum(int x, int y) { ... }
public:
  A(int x, int y) : num(f(x,y)) {
  }
};

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

class Person {
private:
  const int ssn;
public:
  Person(int ssn_) : ssn(ssn_) {}

  void createNewSSN(int newssn) {
    log << "Changed SSN: " << ssn << " to " << newssn << "\n";
    *(int*)&ssn = newssn; // trust me, this is a special case....
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...