Ответ 1
Это описано в cppreference, но в несколько трудном для чтения формате:
Тело определения функции любого конструктора перед открывающей скобкой составного оператора может включать в себя список инициализаторов членов, синтаксис которого представляет собой символ двоеточия
:
, за которым следует разделенный запятыми список одного или нескольких член-инициализаторы, каждый из которых имеет следующий синтаксис...
class-or-identifier brace-init-list (2) (поскольку С++ 11)
...
2) Инициализирует базу или элемент, названный классом или идентификатором, используя инициализацию списка (которая становится инициализацией инициализации по значению, если список пуст и агрегатная инициализация при инициализации совокупности)
То, что это пытается сказать, состоит в том, что X::X(...) : some_member{some_expressions} { ... }
вызывает член класса some_member
для инициализации из some_expressions
. Учитывая,
struct X {
Y y;
X() : y{3} {}
};
элемент данных y
будет инициализирован точно так же, как будет инициализирована локальная переменная Y y{3};
.
В вашем случае std::make_shared<sf::Font>(font)
выводит значение, которое будет использоваться для инициализации члена класса m_font
.