拷贝构造函数和拷贝赋值运算符的调用问题

假设有如下类:
class HasPtr{
public:
HasPtr(const string &s):
ps(new string(s)),i(0){}
HasPtr(const HasPtr &hp){

ps=new string(*hp.ps);
i=hp.i;
}
HasPtr(const char *s):ps(new string(s)),i(0){}
HasPtr & operator=(const HasPtr &);
private:
string *ps;
int i;

};
情况一 :HasPtr h1("hehe"),h2; h2=h1; 问:编译器会优先调用拷贝构造函数和拷贝赋值运算符?
情况二:假如没有定义拷贝构造函数,执行与上述相同的代码。问:编译器会优先调用自定义的拷贝赋值运算符,还是编译器合成的拷贝构造函数?
新手求大神指教。

h1是构造,h2是赋值
只有HasPtr h2(h1)
才是拷贝构造

有自定义的肯定是使用自定义的。不然还要自定义的干嘛。

C++拷贝构造函数(深拷贝,浅拷贝)

上述代码调试的时候h2并没有按照预想的情形编译器会调用赋值运算符的重载函数

http://www.cnblogs.com/BlueTzar/articles/1223313.html