Dlaczego konstruktor kopiowania jest wywoływany, gdy zwracamy obiekt z metody według wartości

dlaczego konstruktor kopiowania jest wywoływany, gdy zwracamy obiekt z metody według wartości. proszę zobaczyć mój poniższy kod, w którym zwracam obiekt z metody, podczas gdy zwracanie kontroli uderza w konstruktora kopii, a następnie powraca. Nie rozumiem następujących rzeczy:
1) dlaczego wywołuje konstruktora kopii.
2) który obiekt przekazuje niejawnie konstruktorowi kopiowania,
3) do którego konstruktor kopiowania obiektów skopiuje treść,
4) jaka jest konieczność kopiowania treści obiektu podczas powrotu. więc pomóż plz.

#include "stdafx.h"
#include <iostream>
#include <string>
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;
 }

questionAnswers(4)

yourAnswerToTheQuestion