#ifndef __MYSTRING__
#define __MYSTRING__
//实现字符串-类,构造函数中将指针作为参数
class String
{
public:
String(const char* cstr=0);
//需要自己写拷贝构造函数和拷贝赋值函数,实现“深拷贝”;否则会直接复制指针m_data,这样多个对象中的m_data指向的同一片地址,这叫“浅拷贝”
String(const String& str);
String& operator=(const String& str);
//需要自己写析构函数,因为在构造函数中可能动态分配了内存,使用默认的析构函数会造成内存泄漏
~String();
char* get_c_str() const { return m_data; }
private:
char* m_data;
};
#include <cstring>
//构造函数,首先判断从指针参数是不是0
inline
String::String(const char* cstr)
{
if (cstr) {
m_data = new char[strlen(cstr)+1];
strcpy(m_data, cstr);
}
else {
m_data = new char[1];
*m_data = '\0';
}
}
inline
String::~String()
{
//分配内存时,分配的是数组形式,现在要用delete[]
delete[] m_data;
}
//拷贝赋值函数,为了可以使用连等a=b=c的形式,所以返回值不能为void
inline
String& String::operator=(const String& str)
{
//判断是不是赋值给本身
if (this == &str)
return *this;
delete[] m_data;
//下行中的str.m_data可以直接取私有变量m_data,是因为相同类型的对象互为friend
m_data = new char[ strlen(str.m_data) + 1 ];
strcpy(m_data, str.m_data);
return *this;
}
inline
String::String(const String& str)
{
m_data = new char[ strlen(str.m_data) + 1 ];
strcpy(m_data, str.m_data);
}
#include <iostream>
using namespace std;
ostream& operator<<(ostream& os, const String& str)
{
os << str.get_c_str();
return os;
}
#endif