1.不增加计数器nmn_strings的值
需要更新的显式复制构造函数
StringBad::StringBad( const String & s)
{
num_strings++;
... // important stuff to go here
}
2. 字符串内容出现乱码
sailor.str=sport.str;
这里复制的并不是字符串,而是一个指向字符串的指针:sports.str指向的内存已经被sailor的析构函数释放,这将导致不确定的、可能有害的后果。程序淸单12.3中的程序生成受损的字符串,这通常是内存管理不善的表现。
解决类设计中这种问题的方法是进行深度复制(deepcopy)。也就足说,复制构造函数应当复制字符串并将副本的地址赋给str成员,而不仅仅是复制字符串地址:
StringBad::StringBad(const StringBad & st)
{
num_strings++;//handle static member update
len=st.len;//same length
str=new char [len+1];// allot space
std::strcpy(str,st.str);// copy string to new location
cout<<numstrings<<":\n"<<str
<<"\"objectcreated\n";//For Your Information
}