Здесь есть два отдельных вопроса: const
и constexpr
.
Давайте начнем с const
, отбрасывая constexpr
.
class Human
{
int age;
public:
Human(int humansAge) : age(humansAge) {}
int GetAge() const { return age; }
};
int main(int argc, char const *argv[])
{
Human somePerson(15);
const int hisAge = somePerson.GetAge();
return 0;
}
const
on GetAge()
объявляет, что вызов GetAge()
не изменит состояние объекта. Таким образом, если бы мы попытались написать:
int GetAge() const { return ++age; }
, это вызвало бы ошибку компиляции, которой не было бы без const
.
Const на hisAge
:
const int hisAge = ...
просто говорит, что hisAge нельзя изменить после его инициализации, поэтому последующее
hisAge = 50;
будет недопустимым.
Однако все это константы времени выполнения. Хотя мы инициализировали человека с жестко запрограммированным 15
, это в равной степени сработало бы со значением, считанным пользователем или файлом.
Если мы вновь введем все ключевые слова constexpr
, это означает, что теперь у нас есть константы времени компиляции. У нас может быть несколько людей с разными возрастами, но все возрасты должны быть доступны во время компиляции, то есть жестко запрограммированы.