这段程序编译连接都没有关问题,但一执行就出现有关问题,大家来看看
这段程序编译连接都没问题,但一执行就出现问题,大家来看看
#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=的实现应该是基本一致的(其中一个可以调用另一个)
#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=的实现应该是基本一致的(其中一个可以调用另一个)