📅  最后修改于: 2023-12-03 15:08:51.854000             🧑  作者: Mango
在C++中,string(字符串)类是一个非常常用的数据类型。但是如果你想要自己创建一个基本功能的自定义String类该怎么办呢?本文将会介绍如何在C++中创建这样一个类。
创建一个头文件,并在其中声明你自己的String类。在这个类中,包含以下几个基本的成员变量和函数:
class MyString {
private:
char* data;
size_t length;
public:
MyString();
MyString(const char*);
MyString(const MyString&);
~MyString();
MyString& operator=(const MyString&);
char operator[](size_t) const;
size_t size() const;
const char* c_str() const;
};
在这个类中,我们需要一个char*
类型的指针来存储自定义字符串的内容。另外,我们还需要一个size_t
类型的变量来存储字符串的长度。这个类中还包含了一些常用的函数,如拷贝构造函数、析构函数、赋值运算符重载函数等。
我们来实现一下构造函数和析构函数。在构造函数中,我们需要对data
指针进行初始化,并对字符串长度进行赋值:
MyString::MyString() : data(nullptr), length(0) {}
MyString::MyString(const char* str) : data(new char[strlen(str) + 1]), length(strlen(str)) {
strcpy(data, str);
}
MyString::MyString(const MyString& str) : data(new char[str.length + 1]), length(str.length) {
strcpy(data, str.data);
}
MyString::~MyString() {
delete[] data;
}
在这个实现中,我们使用了用来分配内存的new
运算符和释放内存的delete
运算符。
operator[]
运算符重载函数接下来,我们来实现赋值运算符重载函数和operator[]
运算符重载函数。这两个函数是自定义字符串类的重要成员函数。
MyString& MyString::operator=(const MyString& str) {
if (this != &str) {
delete[] data;
data = new char[str.length + 1];
length = str.length;
strcpy(data, str.data);
}
return *this;
}
char MyString::operator[](size_t index) const {
return data[index];
}
size
和c_str
函数接下来,我们来实现size
函数和c_str
函数。它们分别用来获取字符串的长度和字符数组的指针:
size_t MyString::size() const {
return length;
}
const char* MyString::c_str() const {
return data;
}
我们现在已经完成了自定义String类的实现,并且可以进行一些简单的测试。
#include <iostream>
#include "mystring.h"
using namespace std;
int main() {
MyString str1("Hello World");
MyString str2 = str1;
MyString str3;
str3 = str2;
cout << str1.c_str() << endl;
cout << str2.c_str() << endl;
cout << str3.c_str() << endl;
cout << "Size of the string str1 is " << str1.size() << endl;
cout << "Character at index 0 of str1 is " << str1[0] << endl;
return 0;
}
输出结果:
Hello World
Hello World
Hello World
Size of the string str1 is 11
Character at index 0 of str1 is H
通过上述步骤,我们已经成功地创建了一个具有基本功能的自定义String类。虽然这个类不如标准库中的string重要,但是了解如何创建自己的String类仍然是一项有趣和有用的技能。