String类的构造函数和析构函数
如果类中有指针类的成员变量时,一定要重载其拷贝构造函数,赋值函数和析构函数。以String类为例:
class String
{
public:
String(const char *str=NULL);
~String();
String(const String& other);
String& operator=(const String &other);
private:
char *m_data;
};
String::String(const char *str)
{
if (str==NULL)
{
m_data=new char[1];
m_data[0]='\0';
}
else
{
m_data=new char[strlen(str)+1];
if (m_data==NULL)
{
exit(0);
}
strcpy(m_data,str);
}
}
String::~String()
{
delete[]m_data;
}
//拷贝构造函数
String::String(const String& other)//必须是传引用,而不是传值!一般不更改内容的加const关键字。如果是String(String other)则在实参复制到形参的时候会调用拷贝构造函数,产生w无休止的调用。
{
m_data=new char[strlen(other.m_data)+1];
if (m_data==NULL)
{
exit(0);
}
strcpy(m_data,other.m_data);
}
//赋值运算符重载
String& String::operator=(const String& other)
{
if (this==&other)//判断传入的参数与当前实例是不是同一个实例,如果不检查判断,当两者是同一个实例时,在释放实例自身内存的时候会导致传入参数的内存也同样释放
{
return *this;
}
delete []m_data;//在分配新内存的时候释放自身已有空间
m_data=NULL;//防止产生野指针
m_data=new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
return *this;
}