В Си++03 константа — это та же переменная, про которую говорится: её нельзя менять, с одним дополнением.
Если эта переменная ещё и целая, при определённых условиях её значение вычисляется при компиляции и может использоваться, например, в шаблонах или массивах.
В Си++11 понятия «нельзя менять» и «вычисляется при компиляции» разделили, добавив ключевое слово constexpr.
Для чего?
1. Обозвать число. Например, 3,1416 — это пи, −128 — минимум signed char, а 16384 — ёмкость промежуточного буфера.
2. Наладить какую-нибудь таблицу данных, которую нельзя менять.
const int FIBONACCI_TABLE[] = { 0, 1, 1, 2, 3, 5, 8, 13 };
3. Сказать: эта переменная передана по указателю/ссылке, но мы её менять не будем.
void sayHello(const std::string& name);
void sayHello(const char* name);
О преобразовании типов. Если мы подали в какую-нибудь операцию или функцию слегка не тот тип, какой хотели, компилятор способен наладить преобразование.
float oneAndHalf = 1.5f;
int one = oneAndHalf; // 1
Это и есть неявное преобразование типа. В данном случае вредное :)
Явное преобразование типа нужно, когда неявное не прокатывает. А именно…
• Компилятор не понимает, какую использовать перегрузку.
• При сравнении знакового числа с беззнаковым — это сравнение можно проводить в знаковом типе, в беззнаковом или в более широком. Не ошибка, но предупреждение.
• Программист запретил неявное преобразование ключевым словом explicit.
• Нужна цепочка из двух преобразований типа.
Явное преобразование бывает тремя способами: вызов конструктора
int(1.5)
, преобразование как в Си
(int)1.5
и ключевое слово static_cast
static_cast<int>(1.5)
.