Ваш пример в его нынешнем виде должен работать нормально:
class MyObj {
public:
const int var;
MyObj(int var) : var(var) {
if (var < 0)
throw std::invalid_argument("must be positive");
}
};
( Живой пример или с конструктором вне строки )
Если вы намереваетесь, что MyObj
всегда будет неизменным, то член const
, вероятно, подойдет. Если вы хотите, чтобы переменная была неизменной в целом, но при этом имела возможность перезаписать весь объект с помощью присваивания, то лучше иметь переменную private
с получателем:
class MyObj {
int var;
public:
MyObj(int var) : var(var) {
if (var < 0)
throw std::invalid_argument("must be positive");
}
int getVar() const { return var; }
};
// now allows
MyObj a(5);
MyObj b(10);
a = b;
Edit
Очевидно, что вы хотите сделать что-то вроде
MyObj(int var) {
if (var < 0)
throw std::invalid_argument("must be positive");
this->var = var;
}
Это невозможно; если переменная const
имеет значение, ее нельзя изменить. Как только тело ({}
бит) конструктора запускается, переменные const
уже имеют значение, хотя в этом случае значение равно «undefined», так как вы его не устанавливаете (а компилятор выдает ошибку из-за это).
Более того, в этом нет никакого смысла. Нет никакой разницы в эффективности установки переменной после проверок или перед ними, и это не похоже на то, что какие-либо внешние наблюдатели смогут увидеть разницу независимо от того, как оператор throw
развернет стек, сразу же деконструируя объект.