1, Почему конструктор копирования вызывается перед конструктором Frame_Pic?
Поскольку элемент p
создается с помощью копирования в списке инициализации конструктора Frame_pic. Список инициализации выполняется до ввода тела конструктора.
На мой взгляд, конструктор копирования вызывается, потому что frame (my_pic) возвращает Picture по значению. Но это следует вызывать после Конструктора Frame_Pic.
frame()
объявляется для возврата экземпляра Picture
по значению, но он закодирован для возврата Frame_pic*
вместо этого. Frame_pic
происходит от P_node
, а Picture
имеет конструктор, который принимает P_node*
, и этот конструктор доступен для frame()
, так что компилятор это позволяет.
2, In Picture :: Picture (P_Node * p_node), почему бы не увеличить счетчик использования? разве это не создает новую Картинку?
Счетчик использования P_node
, а не Picture
. Picture
, возвращаемое frame()
, владеет Frame_pic
, создаваемым frame()
, чей счетчик использования уже равен 1 конструктором Frame_pic
. Вот почему конструктор Picture
не увеличивает счетчик использования - он уже имеет правильное значение.
Frame_pic
содержит свой собственный Picture
, созданный с помощью копирования из другого Picture
, так что конструктору Picture
необходимо увеличить счетчик использования исходного Picture
.