在学习c++过程中,相比起使用char*或者是char[]数组,使用 string 类对字符串进行操作要方便快速很多。string 并不是c++的基本数据类型,它实际上是一个类,那么这个类具体是怎么实现对字符串的操作的呢?如何去自定义一个类去实现string类同样的效果呢?
首先,先列举一些 string 类可以进行的一些操作:
1、创建一个 string 类对象
2、创建一个新的string 类对象,并用字符串初始化赋值
3、给 string 类对象赋值
4、用已有的string 类对象初始化另一个string 类对象
5、将输入的字符赋值给 string 类对象
6、输出 string 类对象
7、访问 string 类对象的某个元素
……
本次只实现以上功能。
以下是代码:
1、 MyString 类的声明
#pragma once
#include<iostream>
using namespace std;
class MyString
{
public:
MyString(); // 无参构造函数
MyString(const char*ch); // 有参构造函数
MyString(const MyString & ms); // 拷贝构造函数
~MyString(); // 析构函数
friend ostream & operator << (ostream & os, MyString & ms);// 重载 <<
friend istream & operator >> (istream & is, MyString & ms);// 重载 >>
char & operator [] (int index); // 重载 []
MyString & operator = (const char *ch); // 重载 =
MyString & operator = (MyString & ms); // 重载赋值运算符
MyString operator + (MyString & ms); // 重载 +
private:
int len; // 长度
char * str;// char类型的指针
};
2、 MyString 类的实现
#include "MyString.h"
// 无参构造函数
MyString::MyString()
{
this->len = 0;
this->str = NULL;//NULL 空指针,没地址; "" 空字符串,有地址的
}
// 析构函数
MyString::~MyString()
{
if (this->str != NULL)// 指针不为空,释放内存
{
delete this->str;
this->str = NULL;
this->len = 0;
}
}
// 有参构造函数
MyString::MyString(const char*ch)
{
if (this->str == NULL)
{
this->len = 0;
this->str = new char[0 + 1];
strcpy_s(this->str, strlen("") + 1, "");
}
len = strlen(ch);
this->str = new char[len + 1];
strcpy_s(this->str, (len + 1), ch);
}
// 拷贝构造函数 深拷贝
MyString::MyString(const MyString & myString)
{
len = myString.len;
this->str = new char[len + 1];
strcpy_s(this->str, (len + 1), myString.str);
}
// 重载 =
MyString & MyString::operator = (const char *ch)
{
if (this->str != NULL)
{
delete[] this->str;
this->str = NULL;
this->len = 0;
}
if (ch != NULL)
{
this->len = strlen(ch);
this->str = new char[len + 1];
strcpy_s(this->str, (len + 1), ch);
}
return *this;
}
// 重载 <<
ostream & operator << (ostream & os, MyString & myString)
{
if (myString.str != NULL) { os << myString.str; }
return os;
}
// 重载 >>
istream & operator >> (istream & is, MyString & myString)
{
if (myString.str != NULL)
{
delete[] myString.str;
myString.str = NULL;
myString.len = 0;
}
char temp_str[4096] = { 0 };
is >> temp_str; // 输入
myString.len = strlen(temp_str);
myString.str = new char[myString.len + 1];
strcpy_s(myString.str, (myString.len + 1), temp_str);
return is;
}
// 重载[]
char & MyString::operator [] (int index) { return this->str[index]; }
// 重载赋值运算符
MyString & MyString::operator = (MyString & myString)
{
if (this == &myString) { return *this; }
if (this->str != NULL) //清空原有的数据
{
delete[] this->str;
this->str = NULL;
this->len = 0;
}
this->len = myString.len;
this->str = new char[this->len + 1];//申请分配一块新的内存
strcpy_s(this->str, (this->len + 1), myString.str);//拷贝
return *this;
}
// 重载 +
MyString MyString::operator + (MyString & myString)
{
MyString temp;
int length = this->len + myString.len;
temp.len = length;
temp.str = new char[length + 1];
memset(temp.str, 0, len + 1);
strcat_s(temp.str, length + 1, this->str);
strcat_s(temp.str, length + 1, myString.str);
// strcat_s() 第二个参数 长度 一定要大于源字符串的长度
// void * memset(void *s, int ch, size_t n);
// 将s中当前位置后面的n个字节用 ch 替换并返回 s 。
return temp;
}
3、 main 方法调用
#include "MyString.h"
void main()
{
MyString myStr; // 创建一个 string 类对象
myStr = "zxcvb"; // 给 string 类对象赋值
cout << "myStr : " << myStr << endl; // 输出
// 创建一个新的string 类对象,并用字符串初始化赋值
MyString myStr1("asdfg");
cout << "myStr1 : " << myStr1 << endl; // 输出
MyString myStr2 = "qwert";
cout << "myStr2 : " << myStr2 << endl; // 输出
// 用已有的string 类对象初始化另一个string 类对象
MyString myStr3 = myStr;
cout << "myStr3 : " << myStr3 << endl << endl; // 输出
// 访问 string 类对象的某个元素
cout << "myStr3 [3]: " << myStr3[3] << endl << endl;// 输出
// 字符串相加
cout << "myStr1 + myStr2 = ";
cout << (myStr1 + myStr2 ) << endl << endl;
cout << "myStr1 + myStr2 + myStr3 = ";
cout << (myStr1 + myStr2 + myStr3) << endl << endl;
// 将输入的字符赋值给 string 类对象
MyString myStr4;
cout << "请输入字符:\n>";
cin >> myStr4; //输入
cout << "myStr4 : " << myStr4 << endl; // 输出
}
4、 运行结果
感谢您的浏览。