今天把String的构造函数、析构函数和赋值函数编写复习了一下,先把代码保存一下,以备以后需要复习的时候。
#include <stdio.h>
#include <string.h>
class String
{
public:
String(const char*str = NULL);
String(const String &other);
~String();
String & operator = (const String &other);
private:
char *m_data;
};
String::String(const char *str)
{
if(str == NULL)
{
m_data = new char[1];
if (m_data != NULL)
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1];
if(m_data != NULL)
strcpy(m_data,str);
}
}
String::String(const String &other)
{
int length = strlen(other.m_data);
m_data = new char[length+1];
if(m_data != NULL)
strcpy(m_data,other.m_data);
}
String::~String()
{
delete [] m_data;
}
String & String::operator =(const String &other)
{
if(this == &other)
return *this;
if(m_data != NULL)
{
delete [] m_data;
m_data = NULL;
}
int length = strlen(other.m_data);
m_data = new char[length+1];
if(m_data != NULL)
strcpy(m_data,other.m_data);
return *this;
}
void main()
{
String str1("hello");
printf("str1 = %s\n",str1);
String str2 = str1; //此时由于是初始化,所以只调用拷贝构造函数,不会调用赋值函数
printf("str2 = %s\n",str2);
String str3("think");
str1 = str3; //此时是调用赋值函数
printf("str1 = %s\n",str1);
}
运行结果:
PS:
实现构造函数就是根据传入的字符串的长度申请一段内存空间,存储这个传入的字符串的值,当字符串为空时,字符串长度为1,内容为'\0';
赋值运算符注意点:
1.首先应该判断是不是对象自身复制,如果是则直接返回当前对象;
2.在申请内存空间时应释放原有的指针所指向的内存,并且让它置为NULL,这个以便在重新申请内存后可以判断是否申请成功;
3.需要返回对象的引用(return *this;).