1.The fact that the copy constructor is used to initialize nonreference parameters of class type explains why 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 like 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.
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;
};