string类问题,为什么赋值调用构造函数

最近在学自实现string类,为什么mystring s;s=“china”;第二句调用的是构造函数?

第一句是调用的构造函数。这样对象实例s已经构造好了。第二句是调用的operator =来进行数据赋值,这个不属于构造函数。mystring s = "asss"; 这样就是调用的拷贝构造函数

C++就是这么规定的。如果说构造函数只有一个参数,也可以用等号。
也就是s = "china";相当于s("china");

刚才实验了一把,说法并不是很准确,我重载了构造函数,mystring::mystring(char* str,int len);
使用mystring s2;s2={"hellow",6};也会调用构造函数,并不是只有一个参数时才会调用。
不明白为什么用对象初始化和赋值时,要分拷贝构造和赋值重载。而用参数表初始化和赋值时,为什么没有分别,都用的是构造函数。
求高手解答,可能问的问题不对,百度不到图片说明

这个字符串C++还有C还有java有区别啊
//C++
string s1="123";
string s2="123;//这两个s1,s2并不是同一个地址
//C
char *p1="123";
char *p2="123";//这两个是一个地址
//Java
string s1,s2;
s1="123";
s2="123";//这两个也是同一个地址

谢谢各位,现总结如下(编译器gcc)
1 mystring s;
2 s="china";
第一句调用构造函数,构造一个空对象。
第二句调用赋值重载'operator =',根据编译器提示,操作数可以是①mystring对象,也可以是②大括号括起来的初始化列表。这里是②。
通过调试,可以看出第二句分为2个步骤,
1).调用构造函数,构造一个临时变量
mystring temp("china");
2).调用赋值重载函数'operator ='
s=temp;

不错啊,学得挺深入的