```c++
hstring::hstring()
{
cstr = nullptr;
usmlen = 0x32;
hstring::hstring(const char* _str) :hstring()
{
copystr(cstr, _str);
}
hstring& hstring::operator=(const hstring& hstr)
{
copystr(cstr, hstr.cstr);
return *this;
}
hstring& hstring::operator=(const char* str)
{
cstr = nullptr;
usmlen = 0x32;
copystr(cstr, str);
return *this;
}
char* str="333333";
hstring hstr{str};
hstr="11111"
请问有人说,最后的operator=(constr char*str)可以不用写,因为前面的hstring(constr char* str)已经把它进行了类型转换,意思就是这里的hstr=1111可以直接使用operator(const hstring& hstr),请问有人能解释一下原理吗
```
不写多一次复制,效率不高。
其次operator=(HString& rh)最好在copystring之前先把本身的字符串delete,否则有内存泄漏。
这段C++代码定义了一个名为" hstring" 的类,它包含三个成员函数:hstring(), hstring(const char* _str)和operator=。
hstring()函数是默认构造函数,它将cstr指针设置为nullptr并将usmlen字段的值设置为0x32。
hstring(const char* _str) 函数是接受一个C字符串作为参数的构造函数。它调用默认构造函数并使用copystr函数复制传递的字符串。
operator=函数有两个重载。第一个重载将一个已经存在的hstring对象作为参数,并将它分配给当前对象(每个对象都有一份自己的数据)。第二个重载将一个C字符串作为参数,并将其转换为hstring对象的值赋值给当前对象。
对于hstring hstr{str},它会调用hstring(const char* _str)构造函数并使用copystr函数将C字符串复制到新创建的hstring对象中。
对于hstr="11111",它不是类型转换,而是赋值操作符的重载。根据定义,它将右侧的C字符串赋值给当前对象。在这种情况下,第二个重载版本的operator=被调用,并且它将先前在堆上分配的内存释放掉,并使用copystr函数将新的C字符串复制到新的内存地址中。因此,第一个重载版本的operator=是不必要的,因为第二个重载版本可以处理任何C字符串,并且没有必要调用hstring(const char* _str)构造函数来转换参数。
同一非终结符的多个候选式存在共同前缀,将导致回溯现象(发现不匹配,需要回退)