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);
}