Почему конструктор копирования вызывается, когда мы возвращаем объект из метода по значению

почему конструктор копирования вызывается, когда мы возвращаем объект из метода по значению. пожалуйста, смотрите мой код ниже, в котором я возвращаю объект из метода, в то время как возвращение элемента управления ударяет конструктор копирования, а затем возвращает. меня не понимают следующие вещи:

1) почему он вызывает конструктор копирования.

2) какой объект неявно передается в конструктор копирования,

3) в какой конструктор объекта копирования будет копироваться содержимое,

4) зачем копировать содержимое объекта при возврате. так что плз помогите.

#include "stdafx.h"
#include 
#include 
using namespace std;

class ClassA
{
   int a, b;
     public:
   ClassA()
   {
     a = 10;
     b = 20;
   }
   ClassA(ClassA &obj)
   {
    cout < "copy constructor called" < endl;
   }
 };

 ClassA function (ClassA &str)
 {
  return str;
 }

 int main ()
 {
   ClassA str;
   function(str);
   //function(str);
   return 0;
 }

Ответы на вопрос(4)

Ваш ответ на вопрос