class Stringg
{
public:
Stringg(const char *str = NULL);
Stringg(const Stringg &other);
~Stringg();
Stringg & operator = (const Stringg& other);
private:
char *m_data;
};
Stringg::Stringg(const char *str)
{
if (str == NULL)
{
m_data = new char[1];
m_data = '\0';
}
else
{
int len = strlen(str);
m_data = new char[len+1];
strcpy(m_data, str);
}
}
Stringg::Stringg(const Stringg &other)
{
int len = strlen(other.m_data);
m_data = new char[len+1];
strcpy(m_data, other.m_data);
}
Stringg::~Stringg()
{
delete[] m_data;
}
Stringg & Stringg::operator = (const Stringg &other)
{
if (this == &other)
return *this;
delete[] m_data;
int len = strlen(other.m_data);
m_data = new char[len+1];
strcpy(m_data, other.m_data);
return *this;
}
strcpy的实现:
char* strcopy(char* strDest, char* strSrc)
{
if (strDest == NULL && strSrc == NULL)
return 0;
char* to = strDest;
while((*strDest++ = *strSrc++) != '\0')
{
;
}
return to;
}
strcat的实现:
//将源字符串加const,表明其为输入参数
char *strcat(char *strDest, const char *strSrc)
{
char *address = strDest; //该语句若放在assert之后,编译出错
assert((strDest != NULL) && (strSrc != NULL)); //对源地址和目的地址加非0断言
while(*strDest) //while(*strDest!=’\0’)的简化形式
{
//若使用while(*strDest++),则会出错,因为循环结束后strDest还会执行一次++,那么strDest将指向'\0'的下一个位置。所以要在循环体内++;因为要是*strDest最后指向该字符串的结束标志’\0’
strDest++;
}
while(*strDest++ = *strSrc++)
{
NULL;
*p++等价于*(p++)。根据c语言的优先级。*与++的优先级同处在第二级别上。他们的优先级是一样的,又因为处在第二级别的优先级运算符是结合方向是从右到左,所以当出现*p++这样的表达式的时候,根据优先级别相同,并且结合方向是从右到左,所以就等价于*(p++)了。那么也就是,先将p指针移动到下个p指针所指向元素的地址的下一个地址,然后再对那个地址取值。(*p)++是取p所指向地址的值,然后再将这个值+1
}
return address;
}