这段程序编译连接都没有关问题,但一执行就出现有关问题,大家来看看

这段程序编译连接都没问题,但一执行就出现问题,大家来看看
#include<iostream>
#include<string>
using namespace std;
class String
{
public:
String(const char *str = NULL); //  constructor 
String(const String &other);      //  copy constructor 
~ String(void){delete []m_data;}; //  destructor
String & operator =(char *str);              
String & operator =(const String &other);//  重载=运算符
int operator==(String &other); //  重载==运算符
int operator==(char *str);
void display();
private:  
char   *m_data;  //  used for storing the string
int  length;
};

String::String(const String &other)             //拷贝构造函数
{
m_data=new char[strlen(other.m_data)+1];
if(m_data!=0) 
strcpy(m_data,other.m_data);
length=strlen(m_data);
}

String::String(const char *str)               
{
m_data=new char[strlen(str)+1];
if(m_data!=0)
strcpy(m_data,str);
length=strlen(m_data);
}

String & String::operator =(char *str)        
{
m_data=new char[strlen(str)+1];
if(m_data!=0)
strcpy(m_data,str);
//length=strlen(m_data);
return *this;
}

String & String::operator =(const String & other)
{
if(this!=&other)
{
m_data=new char[strlen(other.m_data)+1];
delete []m_data;
if(m_data!=0)
strcpy(m_data,other.m_data);
return *this;
}
}

void String::display()
{
cout<<m_data<<"  "<<length<<endl;
}

void main()
{
String s1("first"),s2("second"),s3;
s1.display();
s2.display();
s3.display();
s3="fourth";
}

------解决方案--------------------
String(const char *str = NULL); 
采用了默认形参值,实现的时候没有对这个特殊情况进行判断就直接strlen()。
这是造成运行是错误的直接原因。

另外,String & String::operator =( char *str)
实现中有内存泄露

再好好改改吧,两个operator=的实现应该是基本一致的(其中一个可以调用另一个)