Этот ответ касается C ++, поведение на других языках может отличаться
На самом деле вы должны инициализировать переменные при их объявлении.
Для POD
типов это просто, чтобы вы не забыли инициализировать их и, таким образом, использовать неинициализированные данные.
Для пользовательских типов это делается для оптимизации:
A other;
//this will first construct a, and then assign a new value to a
//the initial construction is useless and takes up processing time
A a;
a = other;
//b is only initialized once
A b = other;
1) Это не создание переменной по значению или ссылке. Он создает его в стеке или в куче. Существуют различия, которые объясняются в большом количестве сообщений здесь на SO.
2) Это не проблема, это скорее привычка для POD. Основная причина, по которой инициализация выполняется в той же строке, что и объявление, была объяснена в первых строках ответа.