21xrx.com
2024-12-22 20:36:18 Sunday
登录
文章检索 我的文章 写文章
C++自定义字符串类
2023-07-05 10:10:26 深夜i     --     --
C++ 自定义 字符串类 类设计 操作符重载

C++中内置的string类在处理字符串时非常方便,但是有时候我们需要更多的自定义操作和更高的性能,这时候自定义字符串类便会派上用场。在C++中,自定义字符串类主要利用了类的特性,使用类中的成员函数和成员变量来实现对字符串的操作。

自定义字符串类通常包含以下几个常用的操作:

1. 构造函数和析构函数:构造函数用于创建类对象时初始化类的成员变量,析构函数用于释放对象占用的内存空间,避免内存泄漏。

2. 复制构造函数和赋值运算符:复制构造函数用于将一个对象的值赋给另一个对象时调用,赋值运算符用于对象之间的赋值操作。

3. 字符串连接和截取操作:字符串连接操作用于将两个字符串拼接成一个字符串,字符串截取操作用于从一个字符串中抽取一部分作为新字符串。

4. 字符串查找和替换操作:字符串查找操作用于查找一个字符串中是否包含另一个字符串,字符串替换操作则用于将一个字符串中的部分内容替换为新的内容。

5. 字符串长度和比较操作:字符串长度操作用于获取一个字符串的长度,字符串比较操作则用于比较两个字符串是否相等或大小顺序。

自定义字符串类通常还可以增加许多其他操作,例如字符串转换类型、字符编码转换、正则表达式匹配等高级操作,具体根据需求来定。

下面是一个简单的自定义字符串类的实现示例:


class MyString {

public:

  MyString(); // 默认构造函数

  MyString(const char* str); // 根据C字符串构造函数

  MyString(const MyString& other); // 复制构造函数

  ~MyString(); // 析构函数

  MyString& operator=(const MyString& other); // 赋值运算符

  MyString operator+(const MyString& other); // 字符串连接

  MyString substring(int start, int len); // 字符串截取

  int find(const char* str); // 字符串查找

  int replace(const char* src, const char* dst); // 字符串替换

  int length(); // 字符串长度

  bool operator==(const MyString& other); // 字符串相等比较

  bool operator<(const MyString& other); // 字符串大小比较

private:

  char* data; // 存储字符串的动态数组

};

MyString::MyString() {

  data = new char[1];

  *data = '\0';

}

MyString::MyString(const char* str) {

  if (str == NULL) {

    data = new char[1];

    *data = '\0';

  } else {

    int len = strlen(str);

    data = new char[len + 1];

    strcpy(data, str);

  }

}

MyString::MyString(const MyString& other) {

  int len = strlen(other.data);

  data = new char[len + 1];

  strcpy(data, other.data);

}

MyString::~MyString() {

  delete[] data;

}

MyString& MyString::operator=(const MyString& other) {

  if (this != &other) {

    delete[] data;

    int len = strlen(other.data);

    data = new char[len + 1];

    strcpy(data, other.data);

  }

  return *this;

}

MyString MyString::operator+(const MyString& other) {

  MyString newStr;

  int len1 = strlen(data);

  int len2 = strlen(other.data);

  newStr.data = new char[len1 + len2 + 1];

  strcpy(newStr.data, data);

  strcat(newStr.data, other.data);

  return newStr;

}

MyString MyString::substring(int start, int len) {

  MyString newStr;

  if (start + len > strlen(data)) {

    len = strlen(data) - start;

  }

  newStr.data = new char[len + 1];

  strncpy(newStr.data, data + start, len);

  newStr.data[len] = '\0';

  return newStr;

}

int MyString::find(const char* str) {

  char* p = strstr(data, str);

  if (p == NULL) {

    return -1;

  }

  return p - data;

}

int MyString::replace(const char* src, const char* dst) {

  int n = 0;

  int slen = strlen(src);

  int dlen = strlen(dst);

  char* p = strstr(data, src);

  while (p != NULL) {

    n++;

    char* tmp = new char[strlen(data) + dlen - slen + 1];

    strncpy(tmp, data, p - data);

    tmp[p - data] = '\0';

    strcat(tmp, dst);

    strcat(tmp, p + slen);

    delete[] data;

    data = tmp;

    p = strstr(data, src);

  }

  return n;

}

int MyString::length() {

  return strlen(data);

}

bool MyString::operator==(const MyString& other) {

  return strcmp(data, other.data) == 0;

}

bool MyString::operator<(const MyString& other) {

  return strcmp(data, other.data) < 0;

}

这是一个非常简单的自定义字符串类实现,具有基本的字符串操作功能。当然,真正的自定义字符串类应当综合考虑性能、安全性、灵活性等多方面的要求,在实现中选择合适的数据结构和算法,以确保类操作的高效和正确性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复