Exercise 13.1:
copy constructor: Constructor that initializes a new object as a copy of another object of the same type. The copy constructor is applied implicitly to pass object to or from a function by value. If we do not provide the copy constructor, the compiler synthesizes one for us.
Exercise 13.2:
The copy constructor is used to initialize nonreference parameters of class type. The copy constructor's own parameter must be a reference. If that parameter were not a reference, then the call would never succeed--to call the copy constructor, we'd need to use the copy constructor to copy the argument, but to copy the argument, we'd need to call the copy constructor, and so on indefinitely.
Exercise 13.5:
class Has_ptr
{
public:
Has_ptr(const std::string &s = std::string()) :
ps(new std::string(s)), i(0) { }
Has_ptr(const Has_ptr &orig) :
ps(new std::string(*orig.ps)), i(orig.i) { }
private:
std::string *ps;
int i;
};