First, the regular constructor is used when you create an object yourself. For example:
class MyClass {
MyClass (int v1, int v2);
...
};
MyClass mc(1,2)
In this example you explicitly create the variable mc.
The copy constructor is used when you want to make a copy of another object. This is commonly used when passing parameters to functions. When you declare a function such as:
int func(MyClass m);
The function recieves a copy of the parameter. This copy is constructed using the copy constructor. You can also use the copy constructor yourself if you decide to create a object copied from another.
class MyClass {
MyClass(int v1, v2); // regular constructor
MyClass(MyClass const &other); // copy constructor
...
};
MyClass::MyClass(MyClass const &other)
{
//copy values from other
v1 = other.v1;
// etc.
}
void f1(MyClass m); // This func takes a copy of MyClass
MyClass mc(1,2); // Create MyClass object with constructor
MyClass mc2(mc1) // mc2 is a copy of mc
f1(mc); // WHen f1 is called, it receives a copy of mc.
f1 can do whatever it wants with it's copy of mc. With it's own copy, whatever it does does not affect the original.