Copy Constructors
Problems occur with shallow copying when we:
initialize an object with the value of another
object:     name s1;   name s2(s1);
pass an object by value to a function or when
we return by value:
     name  function_proto (name)
assign one object to another:
     s1 = s2;