参考string类的功能,自己实现myString类。
时间: 2023-06-13 14:03:48 浏览: 108
编写一个MyString类
4星 · 用户满意度95%
好的,我来为您介绍如何实现myString类。myString类是一个基于字符数组的字符串类,可以进行字符串的拷贝、连接、比较、查找、替换等操作。
首先,我们需要定义myString类的成员变量和成员函数。myString类的成员变量应该包括一个字符数组和一个表示字符串长度的整型变量。成员函数应该包括构造函数、拷贝构造函数、析构函数、赋值运算符重载函数、字符串连接函数、字符串比较函数、字符串查找函数和字符串替换函数。
下面是一个简单的myString类的实现示例:
```c++
#include <iostream>
#include <cstring>
using namespace std;
class myString {
private:
char* data;
int length;
public:
myString() {
data = NULL;
length = 0;
}
myString(const char* str) {
length = strlen(str);
data = new char[length + 1];
strcpy(data, str);
}
myString(const myString& str) {
length = str.length;
data = new char[length + 1];
strcpy(data, str.data);
}
~myString() {
if (data != NULL) {
delete[] data;
data = NULL;
length = 0;
}
}
myString& operator=(const myString& str) {
if (this == &str) {
return *this;
}
if (data != NULL) {
delete[] data;
data = NULL;
length = 0;
}
length = str.length;
data = new char[length + 1];
strcpy(data, str.data);
return *this;
}
myString operator+(const myString& str) {
myString newStr;
newStr.length = length + str.length;
newStr.data = new char[newStr.length + 1];
strcpy(newStr.data, data);
strcat(newStr.data, str.data);
return newStr;
}
bool operator==(const myString& str) {
if (length != str.length) {
return false;
}
return strcmp(data, str.data) == 0;
}
int find(const myString& str) {
char* p = strstr(data, str.data);
if (p == NULL) {
return -1;
}
return p - data;
}
void replace(const myString& oldStr, const myString& newStr) {
int pos = find(oldStr);
if (pos == -1) {
return;
}
int newLength = length + newStr.length - oldStr.length;
char* newData = new char[newLength + 1];
strncpy(newData, data, pos);
newData[pos] = '\0';
strcat(newData, newStr.data);
strcat(newData, data + pos + oldStr.length);
delete[] data;
data = newData;
length = newLength;
}
void display() {
cout << data << endl;
}
};
int main() {
myString str1("Hello");
myString str2("World");
myString str3 = str1 + str2;
str1.display();
str2.display();
str3.display();
if (str1 == str2) {
cout << "str1 is equal to str2" << endl;
}
else {
cout << "str1 is not equal to str2" << endl;
}
int pos = str3.find(str1);
if (pos == -1) {
cout << "str1 is not found in str3" << endl;
}
else {
cout << "str1 is found in str3 at position " << pos << endl;
}
str3.replace(str1, str2);
str3.display();
return 0;
}
```
在上面的示例中,我们定义了myString类的成员变量data和length,分别表示字符串的字符数组和字符串长度。在构造函数中,我们通过调用strlen函数来获取字符串长度,并使用new运算符动态分配内存来创建字符数组。在析构函数中,我们使用delete运算符释放动态分配的内存。
在赋值运算符重载函数中,我们首先判断是否将自身赋值给自身。如果是,则直接返回当前对象的引用。如果不是,则释放当前对象的内存,分配新的内存,并将另一个对象的数据复制到当前对象中。
在字符串连接函数中,我们创建一个新的myString对象newStr,并将两个字符串的长度相加,然后使用new运算符动态分配内存来创建字符数组。我们使用strcpy函数将第一个字符串复制到新的字符数组中,然后使用strcat函数将第二个字符串连接到新的字符数组中,并将新的myString对象返回。
在字符串比较函数中,我们首先比较两个字符串的长度是否相等。如果长度不相等,则两个字符串不相等。如果长度相等,则使用strcmp函数比较两个字符串是否相等。
在字符串查找函数中,我们使用strstr函数在当前字符串中查找另一个字符串。如果找到了,则返回该字符串在当前字符串中的位置;如果没有找到,则返回-1。
在字符串替换函数中,我们首先调用find函数查找要替换的字符串在当前字符串中的位置。如果找到了,则使用new运算符动态分配内存来创建新的字符数组,将旧的字符数组中的数据复制到新的字符数组中,并将新的字符串插入到旧的字符串的位置。最后,释放旧的字符数组的内存,将新的字符数组的指针赋值给当前对象的data成员变量,将新的字符串的长度赋值给当前对象的length成员变量。
在main函数中,我们创建了三个myString对象,分别表示Hello、World和HelloWorld字符串。我们使用+运算符将两个字符串连接起来,并使用==运算符比较两个字符串是否相等。我们使用find函数查找一个字符串在另一个字符串中的位置,并使用replace函数替换一个字符串为另一个字符串。
阅读全文