Переменные-члены инициализируются в том порядке, в котором они были объявлены в объявлении класса (, даже если они есть в другом порядке в списке инициализации конструктора ), так что да, ко времени c
инициализируется, b
будет инициализироваться, и вы можете использовать b
для инициализации c
.
Как отмечает Рикардо Карденес, он все равно будет работать, даже если вы объявите c
до b
в определении класса (что означает, что вы передадите C::C
ссылку на неинициализированный B
), однако вы вызываете неопределенное поведение если вы используете объект внутри C::C
. Сначала безопаснее объявить b
, потому что, хотя вы не можете использовать b
внутри C::C
сейчас, вы можете в будущем забыть, что ссылка относится к неинициализированному B
и вызывает UB.
И нет, вам не нужно явно инициализировать b
(если это не POD ), если вы не хотите, чтобы он создавался по умолчанию. Так что этот код будет тем, что вы хотите (опять же, если B
не POD):
A::A() : c(b) { }