String类
举栗子,通过讲解String类,了解C++类的设计
1. 构造函数
- string(); //无参构造
- string(const char*);
string(const string& that); //拷贝构造
2. 赋值
string& operator=(const string& s); //把字符串s赋值给当前字符串
string& operator=(const char* s); //用字符串赋值
3. 容量
int size()const; //当前字符串的长度
- bool empty() const; //测试是否为空字符串
int max_size() const; //可以存放的最大字符个数
4. 元素访问
- char& at(int n); //返回下标为n的字符引用,执行边界检查
- const char* c_str()const; /返回指向内部字符数组的const指针
string substr(int pos = 0, int n = npos)const; //返回pos开始的n个字符组成的子串,string::npos是一个很大的常数,用来表示不存在的位置
5. 字符串操作
增
- string& insert(int pos, const string& s); //在pos位置插入字符串s
- 删
- void clear(); //移除string的所有字符。
- string& erase(int pos = 0, int n = npos); //删除pos开始的n个字符,返回修改后的字符串。
- 改
- string& operator+=(const string& s); //把字符串s连接到当前字符串的结尾
- string& replace(int start, int n, const char* s); //将从start开始的n个字符用字符串s替换
- void resize(int len, char c); //将当前字符串大小设置为len,空白部分用字符串
- int copy(char* s, int n, int pos = 0) const; //把当前字符串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目
查
string operator+(const string& s1, const string& s2); //连接s1和s2
- bool operator==(const string& s1, const string& s2)const; //比较两个字符串是否相等
- bool operator!=(const string& s1, const string& s2)const; //比较两个字符串是否相等
- bool operator>(const string& s1, const string& s2)const; //比较两个字符串大小
- bool operator<(const string& s1, const string& s2)const; //比较两个字符串大小
- int stoi(const string& str, int* pos = 0, int base = 10); //pos用来保存转换后的字符的个数
- double stod(const string& str, double* pos = 0);
- string to_string(int value);
- string to_string(double value);
7. 示例代码:
```cppinclude
using namespace std;
int main(){ string str; string str1(“hello”); string str2(str1);
str = str1;str = "world";cout << "str : " << str << endl;cout << "str1 : " << str1 << endl;cout << "str2 : " << str2<< endl;cout << "size : " << str.size() << endl;cout << "empty : " << str.empty() << endl;cout << "max_size : " << str.max_size() << endl;cout << "[] : " << str[3] << endl;cout << "at : " << str.at(3) << endl;cout << "[] : " << str[7] << endl;//cout << "at : " << str.at(7) << endl;cout << "c_str : " << str.c_str() << endl;cout << "c_str : " << (void*)str.c_str() << endl;cout << "substr : " << str.substr(1, 3) << endl;cout << "substr : " << str.substr(1) << endl;cout << "insert : " << str.insert(1, string("abc")) << endl;//str.clear();cout << "str : " << str << endl;str.resize(10, 'x');cout << "str : " << str << endl;char strArr[4] = {0};str.copy(strArr, 4, 3);cout << "copy : " << strArr << endl;int n;n = stoi(string("123"));cout << "n = " << n << endl;n = stoi(string("123"), 0, 16);cout << "n = " << hex << n << endl;str = to_string(123);cout << "str : " << str << endl;return 0;
}
<a name="qVTke"></a>## 8. 手写String类<a name="JWMHs"></a>### - main.cpp```cpp#include "mystring.h"int main(int argc, const char *argv[]){MyString str1("Hu");cout << str1 << endl;cout << str1.size() << endl;cout << str1[1] << endl;MyString str2 = str1;cout << str2 << endl;MyString str3("Mingdong");cout << str3 << endl;cout << str3.size() << endl;cout << str3[1] << endl;cout << "---------------" << endl;cout << str1 + str3 << endl;MyString newStr;cin >> newStr;cout << newStr << endl;cout << newStr.size() << endl;return 0;}
- mystring.h
#ifndef __MYSTRING_H__#define __MYSTRING_H__using namespace std;#include <iostream>#include <cstring>class MyString {private:char* mstr;public:MyString(); //无参构造MyString(const char* str); //有参构造MyString(const MyString& that); //拷贝构造~MyString(); //析构int size(); //计算字符串的字符个数void clear(); //清空字符串的字符MyString& operator=(const MyString& other); //字符串赋值运算MyString& operator+=(const MyString& other); //字符串+=运算char operator[](unsigned int n); //字符串下标运算//友元函数friend ostream& operator<<(ostream& out, const MyString& string); //字符串输出friend istream& operator>>(istream& in, MyString& string); //字符串输入friend MyString operator+(const MyString& string1, const MyString& string2); //字符串+运算friend bool operator==(const MyString& string1, const MyString& string2); //字符串==运算friend bool operator!=(const MyString& string1, const MyString& string2); //字符串!=运算};#endif
- mystring.cpp
#include "mystring.h"MyString::MyString() //无参构造{mstr = new char[1];mstr[0] = '\0';}MyString::MyString(const char* str) //有参构造{if(str == NULL){mstr = new char[1];mstr[0] = '\0';}else{int len = strlen(str);mstr = new char[len + 1];strcpy(mstr, str);}}MyString::MyString(const MyString& that) //拷贝构造{int len = strlen(that.mstr);mstr = new char[len + 1];strcpy(mstr, that.mstr);}MyString::~MyString() //析构{delete[] mstr;}int MyString::size() //计算字符串的字符个数{return strlen(mstr);}void MyString::clear() //清空字符串的字符{int len = strlen(mstr);if(len == 0){return;}else{for(int i = 0; i < len; i++){mstr[i] = '\0';}return;}}MyString& MyString::operator=(const MyString& other) //字符串赋值运算{if(this == &other){return *this;}else{delete[] mstr;int len = strlen(other.mstr);mstr = new char[len + 1];strcpy(mstr, other.mstr);return *this;}}MyString& MyString::operator+=(const MyString& other) //字符串+=运算{MyString old = *this;delete[] mstr;int len = strlen(old.mstr) + strlen(other.mstr);mstr = new char[len + 1];strcpy(mstr, old.mstr);strcat(mstr, other.mstr);return *this;}char MyString::operator[](unsigned int n) //字符串下标运算{return mstr[n];}//友元函数的定义实现ostream& operator<<(ostream& out, const MyString& string) //字符串输出{out << string.mstr;return out;}istream& operator>>(istream& in, MyString& string) //字符串输入{in >> string.mstr;return in;}MyString operator+(const MyString& string1, const MyString& string2) //字符串+运算{MyString string = string1;string += string2;return string;}bool operator==(const MyString& string1, const MyString& string2) //字符串==运算{return !strcmp(string1.mstr, string2.mstr);}bool operator!=(const MyString& string1, const MyString& string2) //字符串!=运算{return strcmp(string1.mstr, string2.mstr);}
