Примечание. Во всех ответах о том, что будет вызван конструктор копирования, возможно, что этого не произойдет, поскольку компилятор провел некоторую оптимизацию.
1) Почему consturctor копирования не вызывается после Picture temp = frame(my_pic)
?
Temp изображения = frame (my_pic); это последняя строка перед оператором return, поэтому все, что происходит после того, как программа разрушена (вызваны деструкторы, очищены стек и куча), завершается.
2) Почему деструктор называется?
Деструктор (в каждом случае здесь) вызывается, потому что программа закрылась. Примечание: хотя это происходит в конце программы, это не значит, что вы не должны убирать за собой!
3) В Picture frame(const Picture& pic)
будет ли вызываться конструктор копирования, если вызывается функция?
Нет. Вы не сделали копию, передали ссылку на то, где она находится, и создали новую, и компилятор оптимизирует копию при возврате.
4) Если я изменю Picture frame(const Picture& pic)
на Picture frame(Picture p)
, будет ли вызываться конструктор копирования при вызове функции?
Нет. Он может вызываться при входе в функцию, но компилятор оптимизирует копию при возврате.
5) Когда будет вызван конструктор копирования? Произойдет ли это, когда класс будет возвращен функцией по значению? Когда класс передается в функцию по значению?
Конструктор копирования будет вызываться в обоих случаях.
6) Когда будет вызван деструктор? когда каждый раз заканчивается время жизни переменной? Означает ли это, что если я передам переменную в функцию по значению, ее деструктор будет вызван после выполнения функции?
Когда деструктор будет вызван, когда объект уничтожен. Это может быть потому, что вы уничтожили его или функция, содержащая его, возвращает (завершает), а его переменные / объекты удаляются из стека или, в некоторых случаях (в конце программы), из кучи.