#ifndef __STRING__
#define __STRING__
#include<ostream>
class String
{
public:
String(const char* cstr = 0); //构造函数
String(const String& str); //拷贝构造
String& operator = (const String& str); //拷贝复制
~String(); //析构函数
char* get_c_str() const { return m_data; }
private:
char* m_data;
};
inline String::String(const char* cstr) //这里不能重新定义默认参数,如果需要参数的其他值,则应将默认参数留空。
{
if (cstr) //检查cstr是否为空指针
{
m_data = new char[std::strlen(cstr) + 1];
strcpy_s(m_data, (std::strlen(cstr)+1),cstr);
}
else
{
m_data = new char[1];
*m_data = '\0';
}
}
inline String::String(const String& str)
{
if (str.m_data)
{
m_data = new char[strlen(str.m_data) + 1]; //拷贝构造中,申请的内存空间为str.m_data的长度+1,('\0'的原因)
strcpy_s(m_data, (std::strlen(str.m_data) + 1), str.m_data);//strcpy_s是比strcpy更安全的函数
}
else
{
m_data = new char[1];
*m_data = '\0';
}
}
inline String::~String()
{
delete[] m_data;
}
inline String& String::operator = (const String& str)
{
if (this == &str) //在拷贝复制时首先检查=左右的指针是否为同一指针。若指针相同,delete时会导致=两侧的指针同时被delete
{
return *this;
}
delete[] m_data; //delete掉目标指针,避免内存泄露
m_data = new char[strlen(str.m_data) + 1];
strcpy_s(m_data, (std::strlen(str.m_data) + 1), str.m_data);
return *this;
}
std::ostream& operator<< (std::ostream& os, const String& str)
{
if (str.get_c_str())
return os << str.get_c_str();
else
return os << "NULL";
}
#endif // !__STRING__