Изменение того, что не должно быть изменено, является одним из наиболее распространенных источников ошибок.
Поэтому стоит указать 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....
}
};