Drobna poprawka. Zamień to:
Klasa (const Klasa &p1)
{
pole1 = Klasa.pole1;
pole2 = Klasa.pole2;
}
na to:
Klasa (const Klasa &p1)
{
pole1 = p1.pole1;
pole2 = p1.pole2;
}
Powinno śmigać i się kompilować ;-)
Aby wywołać konstruktor kopiujący postępujesz podobnie jak ze zwykłym konstruktorem. Można to zrobić jawnie:
Klasa p1( a1 ); // Konstruktor kopiujący, przyjmuje obiekt a1.
Konstruktor taki jest też wywoływany niejawnie. Niejawne wywołania konstruktora występują, np. gdy przesyłamy obiekt do funkcji przez wartość. Czyli coś takiego:
void funkcja( Klasa k1 )
{
// ...
}
int main()
{
Klasa a1;
funkcja( a1 );
return 0;
}
argument funkcji "k1", to jest inny obiekt, tak więc po wywołaniu funkcji z argumentem "a1", następuje wywołanie konstruktora kopiującego obiektu "k1".
Warto jeszcze nadmienić, że każda klasa ma domyślnie zrealizowany operator przypisania i konstruktor kopiujący, więc dla każdej klasy nadal jest możliwe przepisywanie wartość po wartości. Przykład:
#include <iostream>
using namespace std;
class Klasa
{
public:
int zmienna;
};
int main()
{
Klasa k1, k2;
k1.zmienna = 5;
k2 = k1; // operator przypisania
Klasa k3( k2 ); // Konstruktor kopiujący
cout << k3.zmienna;
return 0;
}