B b; когда выполняется вышеуказанная строка, сначала вызывается конструктор B. поэтому сначала печатается «внутри конструктора b».
Затем, когда элемент управления достигает obj.function (); объект obj уже инициализирован компилятором, поскольку это объект типа stati c. поэтому obj.function () вызывается без проблем и печатается «внутренняя функция».
Теперь элемент управления достигает AB :: obj; определение объекта stati c. поэтому вызывается конструктор A и печатается «внутри конструктора A».
примечание: конструктор используется только тогда, когда вызывается определение объекта stati c. поэтому только мы не видим конструктор A, если stati c A obj; объявлен внутри класса B.
Может возникнуть другой вопрос, почему объявление делается только для переменных c внутри класса, а определение должно вызываться явно вне класса?
Ответ следующий: определение класса может быть выполнено в файле заголовка, и этот файл заголовка может быть включен в несколько файлов *. cpp. Итак, если определение также присутствует внутри класса, тогда переменная stati c будет иметь несколько определений, которые вызовут ошибку.
Inorder, чтобы избежать вышеуказанного, определение для членов stati c вне класса сделано исключительно.