C++自写string类
文章目录
- private成员变量如下
- public中的主要成员函数
- 全缺省构造函数
- 拷贝构造函数
- operator=()函数
- 析构函数
- public中非主要成员函数(string类的函数)
- c_str()
- clear()
- size()
- capacity()
- string常用函数实现
- reserve(n)
private成员变量如下
1.string类中可以看成由char类型的字符一个一个拼接而成,此处定义成员变量char* _str。
2.需要知道存储的字符长度,定义成员变量 _size。
3.字符串总的存储容量(不包括\0),定义成员变量 _capacity。
4.npos在下面文章中进行介绍。
class string {
public:
private:char* _str = nullptr;size_t _size = 0;size_t _capacity = 0;//声明定义要分离static const size_t npos;
};
public中的主要成员函数
全缺省构造函数
1.在c语言提供的库函数中,使用strlen()计算此时字符串的长度。
2.将容量赋值为字符串长度。
3.new一个比capacity容量加一的字符串(此处的+1,是为了存储\0)。
4.使用库函数strcpy()进行拷贝,将str拷贝到_str中。
string(const char* str = "") {_size = strlen(str);//_capacity中不包括‘\0’_capacity = _size;// +1存储‘\0’_str = new char[_capacity + 1];strcpy(_str, str);
}
拷贝构造函数
法一:
1.给与_str同样的容量。
2.使用c语言的库函数strcpy()进行拷贝。
//s2(s1)
string(const string& str) {_str = new char[str._capacity + 1];strcpy(_str, str._str);_size = str._size;_capacity = str._capacity;
}
法二:
1.创建一个临时变量tmp,用于存储str的值。
2.将_str和tmp的数据进行交换,本质上是将tmp的数据给到_str中。
string(const string& str) {string tmp(str._str);swap(_str, tmp._str);swap(_size, tmp._size);swap(_capacity, tmp._capacity);
}
operator=()函数
1.在赋值操作中,要释放s2的数据。(如果此时s1赋值给s1,这种思路就会使s1变为空,将空有赋值给了s1,使s1的值发生了变化,所以在赋值前要进行判断,防止自己给自己赋值)(这是重点)。
2.将_str的容量开辟为s1的容量加1,此时的加1,是为了存储 \0 。
3.使用strcpy()函数,将s2的字符串数据赋值给s1的字符串数据。
4.将s1的字符串长度和容量都赋值给s2的字符串长度和容量。
5.返回的要是this指针。(返回指针可以确保多次赋值)
//s2 = s1
string& operator=(const string& s) {//防止自己给自己赋值if (this != &s) {delete[] _str;_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity; }return *this;
}
析构函数
将成员函数的值,全部清空。
~string() {delete[] _str;_str = nullptr;_size = 0;_capacity = 0;
}
public中非主要成员函数(string类的函数)
c_str()
返回字符串的数据。
const char* c_str() const {return _str;
}
clear()
不清空间,只清数据,字符串的容量不变。
void clear() {//不清空间,清数据_str[0] = '\0';_size = 0;
}
size()
返回字符串的长度。
size_t size() const {return _size;
}
capacity()
返回字符串的容量。
size_t capacity() const {return _capacity;
}
string常用函数实现
reserve(n)
扩容函数,使字符串的长度为 capacity = n。
;1.只有当n大于字符串的容量的时候才进行扩容。
2.此时要开辟的临时变量要为n+1,此时的加1,是为了存储 \0 。
3.使用库函数strcpy(),将原有的数据拷贝到临时变量tmp中。
4.释放原有_str的数据。
5.将临时变量的数据tmp给到_str.。这里默认调用了operator=函数。
void string::reserve(size_t n) {if (n > _capacity) {// +1存储‘\0’char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}
}
觉得我回答有用的话,记得点个关注哟!谢谢支持!