### C++ 实现 CString 类详解
#### 一、概述
在C++中,字符串操作是一项基本且重要的功能。本文档将详细介绍如何使用C++来实现一个详尽的`CString`类,该类提供了多种字符串处理功能,如创建、复制、连接、截取等。
#### 二、类结构与成员变量
`CString`类主要包括以下成员变量:
- `char *m_pStr`: 指向字符串的指针。
- `int m_len`: 字符串长度。
#### 三、构造与析构函数
1. **默认构造函数**:
```cpp
CString::CString()
{
m_pStr = NULL;
m_len = 0;
}
```
- **功能**: 初始化一个新的`CString`对象,其初始状态为空字符串。
2. **带参数构造函数**:
```cpp
CString::CString(char *p)
{
m_pStr = new char[strlen(p) + 1];
strncpy(m_pStr, p, strlen(p) + 1);
m_len = strlen(p);
}
```
- **功能**: 使用指定的字符数组初始化`CString`对象。
- **参数**: `char *p`为待初始化的字符数组。
3. **拷贝构造函数**:
```cpp
CString::CString(CString &c)
{
m_pStr = new char[strlen(c.GetStr()) + 1];
strncpy(m_pStr, c.GetStr(), strlen(c.GetStr()) + 1);
m_len = strlen(c.GetStr());
}
```
- **功能**: 创建一个新对象,作为另一个`CString`对象的副本。
- **参数**: `CString &c`为待拷贝的`CString`对象。
4. **析构函数**:
```cpp
CString::~CString()
{}
```
- **功能**: 析构函数未具体实现删除内存的功能,实际应用中应释放分配的内存资源。
#### 四、成员函数
1. **获取字符串方法**:
```cpp
const char *CString::GetStr()
{
return m_pStr;
}
```
- **功能**: 返回当前`CString`对象所包含的字符串。
2. **获取长度方法**:
```cpp
int CString::GetLength()
{
return m_len;
}
```
- **功能**: 返回当前字符串的长度。
3. **赋值运算符重载**:
```cpp
CString& CString::operator=(const CString &m)
{
if (&m == this)
return *this;
if (0 != m_len)
{
delete m_pStr;
}
m_pStr = new char[m.m_len];
m_len = m.m_len;
for (int i = 0; i < m_len; i++)
{
this->m_pStr[i] = m.m_pStr[i];
}
m_pStr[i] = '\0';
return *this;
}
```
- **功能**: 实现了`=`运算符重载,用于对两个`CString`对象进行赋值操作。
- **参数**: `const CString &m`为待赋值的`CString`对象。
4. **字符串连接运算符重载**:
```cpp
CString CString::operator+(CString &m)
{
int len = m.GetLength();
CString *tem;
tem->m_len = len + m_len + 1;
tem->m_pStr = new char[len + m_len + 1];
strncpy(tem->m_pStr, this->m_pStr, len);
strcat(tem->m_pStr, m.GetStr());
return *tem;
}
```
- **功能**: 实现了`+`运算符重载,用于连接两个`CString`对象。
- **参数**: `CString &m`为待连接的`CString`对象。
5. **字符串追加运算符重载**:
```cpp
CString& CString::operator+=(CString &m)
{
int len = m.GetLength();
char *temp = NULL;
if (this->m_len > strlen(this->m_pStr) + len + 1)
{
strcat(this->m_pStr, m.m_pStr);
return *this;
}
temp = new char[len + m_len + 1];
strcpy(temp, this->m_pStr);
strcat(temp, m.m_pStr);
delete this->m_pStr;
this->m_pStr = temp;
return *this;
}
```
- **功能**: 实现了`+=`运算符重载,用于将一个`CString`对象追加到另一个`CString`对象的末尾。
- **参数**: `CString &m`为待追加的`CString`对象。
6. **左截取方法**:
```cpp
char *CString::Left(int len)
{
if (len > m_len)
{
len = m_len;
}
char *p;
p = new char[len];
for (int i = 0; i < len; i++)
{
*(p + i) = *(m_pStr + i);
}
return p;
}
```
- **功能**: 截取字符串的左侧部分。
- **参数**: `int len`为截取的长度。
7. **右截取方法**:
```cpp
char *CString::Right(int len)
{
int j = 0;
if (len > m_len)
len = m_len;
char *p;
p = new char[len];
for (int i = m_len - len; i < m_len; i++)
{
*(p + j) = *(m_pStr + i);
j++;
}
return p;
}
```
- **功能**: 截取字符串的右侧部分。
- **参数**: `int len`为截取的长度。
#### 五、总结
本篇文档详细介绍了如何使用C++实现一个详尽的`CString`类,包括构造与析构函数、成员函数等功能模块。通过这些方法的实现,可以方便地进行字符串的创建、复制、连接、截取等操作,从而为开发人员提供了一个强大的工具包来处理字符串数据。
注意:以上代码示例仅供参考,实际应用时还需根据具体情况调整和完善。
1