However, I (think) I still don't understand the uses of the copy ctor/assignment op;
class Foo{ private: int data public: /*normal ctor*/ Foo(int d) : data(d) {}; /*copy ctor*/ Foo(const &Foo copy) : data(copy.data){}; /*assignment op*/ Foo& operator=(const &Foo copy){ data = copy.data }; };is the above correct?
It's bad style, because the default copy constructor and assignment operator do the same thing. Typically the reason you need to overload these functions is when you are writing a class that manages a resource, or is a container.
Also, for managing resources, you can sometimes avoid writing the rule of three functions, by useing a smart pointer, like unique_ptr with a custom deleter.