Как используются константы и кастинги?
В Си++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).
const double pi = 3.14159265358979323846;

std::cout << whatever * pi << endl;
std::cout << whatever * 3.14159265358979323846 << endl;
думаю первый вариант куда нагляднее