自己撸一个常见的string类。
#include <iostream>
#include <string>
using namespace std;
class mystring
{
public:
mystring(const char *str = nullptr);//构造函数
mystring(const mystring &other);//拷贝构造函数
~mystring();//析构函数
mystring& operator = (const mystring &other);//赋值拷贝函数
private:
char *m_data;//字符指针,指向该对象的字符串内存
};
mystring::mystring(const char *str)//构造函数
{
if (str == nullptr) {//可能会有无参构造
m_data = new char[1];//只新建一块char内存,加个结束符就好了
m_data[0] = '\0';
}
else {//有参构造
int len = strlen(str) + 1;//注意,strlen返回的值不包含结束符,所以需要+1
m_data = new char[len];
strncpy(m_data, str, len);//统统拷贝过来
}
}
mystring::~mystring()//析构函数
{
if (m_data) {
delete[] m_data;//因为m_data指向的是一块连续内存,所以规范使用delete[]
m_data = nullptr;//避免成为野指针
}
}
mystring::mystring(const mystring &other) {//拷贝构造函数
int len = strlen(other.m_data) + 1;//其实本质也是拷贝字符串,只不过参数从str变成为other.m_data
m_data = new char[len];
strncpy(m_data, other.m_data, len);
}
mystring& mystring::operator = (const mystring &other) {//赋值构造函数
delete[] m_data;
int len = strlen(other.m_data) + 1;//拷贝过程重复
this->m_data = new char[len];
strncpy(this->m_data, other.m_data, len);
return *this;//注意是要返回*this的
}