请设计一个简单字符串类 (CSimpleString),使 CSimpleString 对象比普通的字符(char)数组更安全、更易于使用。 a) 功能说明:CSimpleString 对一个可变长度字符串(char *)数据进行封装,提供字 符串的存储分配和释放;提供基于字符串数据的通用操作和运算符重载。 b) 需求说明: i. 构造函数和析构函数。CSimpleString 提供 3 种构造函数: 1. 空构造函数:创建一个空字符串对象。 例:CSimpleString str; 2. 接收一个字符串指针(char *)的构造函数:使用一个已知的字符串构造 对象。 例:CSimpleString str(“abc”); 3. 拷贝构造函数:可以用一个 CSimpleString 对象构造另一个 CSimpleString 对象。 例:CSimpleString str0(“abc”); CSimpleString str(str0); ii. 字符串操作与运算符重载 1. 赋值运算符(=)重载:允许将一个字符串指针直接赋值给一个 CSimpleString 对象,也允许将一个 CSimpleString 对象赋值给另一个 CSimpleString 对象; 例:CSimpleString str0(“abcd”), str1; str1 = “abc”; str1 = str0;CSimpleString类的数据成员请使用串的堆分配顺序存储表示(参见数据结构第四章,串);你需要实现一系列如b)部分需求说明中的各种(成员、友元)函数,以及在main函数中测试这些函数的功能。

时间: 2024-02-27 16:51:42 浏览: 23
CSimpleString类的设计如下: ``` #include <iostream> #include <cstring> class CSimpleString { public: // 默认构造函数 CSimpleString() : m_pData(nullptr), m_nLength(0) {} // 接收一个字符串指针的构造函数 CSimpleString(const char* pData) : m_pData(nullptr), m_nLength(0) { if(pData != nullptr) { m_nLength = strlen(pData); m_pData = new char[m_nLength + 1]; strcpy(m_pData, pData); } } // 拷贝构造函数 CSimpleString(const CSimpleString& other) : m_pData(nullptr), m_nLength(0) { if(other.m_pData != nullptr) { m_nLength = other.m_nLength; m_pData = new char[m_nLength + 1]; strcpy(m_pData, other.m_pData); } } // 赋值运算符重载 CSimpleString& operator=(const char* pData) { if(m_pData == pData) { return *this; } delete[] m_pData; m_pData = nullptr; m_nLength = 0; if(pData != nullptr) { m_nLength = strlen(pData); m_pData = new char[m_nLength + 1]; strcpy(m_pData, pData); } return *this; } // 赋值运算符重载 CSimpleString& operator=(const CSimpleString& other) { if(m_pData == other.m_pData) { return *this; } delete[] m_pData; m_pData = nullptr; m_nLength = 0; if(other.m_pData != nullptr) { m_nLength = other.m_nLength; m_pData = new char[m_nLength + 1]; strcpy(m_pData, other.m_pData); } return *this; } // 析构函数 ~CSimpleString() { delete[] m_pData; m_pData = nullptr; m_nLength = 0; } // 获取字符串长度 int Length() const { return m_nLength; } // 获取字符串内容 const char* GetData() const { return m_pData; } // 字符串连接运算符重载 friend CSimpleString operator+(const CSimpleString& str1, const CSimpleString& str2) { CSimpleString str; str.m_nLength = str1.m_nLength + str2.m_nLength; str.m_pData = new char[str.m_nLength + 1]; strcpy(str.m_pData, str1.m_pData); strcat(str.m_pData, str2.m_pData); return str; } // 字符串比较运算符重载 friend bool operator==(const CSimpleString& str1, const CSimpleString& str2) { if(str1.m_nLength != str2.m_nLength) { return false; } return strcmp(str1.m_pData, str2.m_pData) == 0; } friend bool operator!=(const CSimpleString& str1, const CSimpleString& str2) { return !(str1 == str2); } friend bool operator<(const CSimpleString& str1, const CSimpleString& str2) { return strcmp(str1.m_pData, str2.m_pData) < 0; } friend bool operator>(const CSimpleString& str1, const CSimpleString& str2) { return strcmp(str1.m_pData, str2.m_pData) > 0; } // 下标运算符重载,返回字符引用 char& operator[](int index) { if(index < 0 || index >= m_nLength) { throw std::out_of_range("Index out of range"); } return m_pData[index]; } // 下标运算符重载,返回常量字符引用 const char& operator[](int index) const { if(index < 0 || index >= m_nLength) { throw std::out_of_range("Index out of range"); } return m_pData[index]; } private: char* m_pData; // 字符串数据 int m_nLength; // 字符串长度 }; ``` CSimpleString类提供了三种构造函数和赋值运算符(=)的重载,同时还提供了获取字符串长度和获取字符串内容的函数。CSimpleString还提供了字符串连接运算符(+)和字符串比较运算符(==、!=、<、>)的重载,以方便字符串的操作和比较。另外,CSimpleString还提供了下标运算符([])的重载,以方便通过下标访问字符串中的字符。字符串数据的类型使用堆分配顺序存储,以提供更好的安全性和易用性。 下面是在main函数中对CSimpleString类的测试: ``` int main() { // 构造函数测试 CSimpleString str1; std::cout << "str1: " << str1.GetData() << ", Length: " << str1.Length() << std::endl; CSimpleString str2("abc"); std::cout << "str2: " << str2.GetData() << ", Length: " << str2.Length() << std::endl; CSimpleString str3(str2); std::cout << "str3: " << str3.GetData() << ", Length: " << str3.Length() << std::endl; // 赋值运算符测试 str1 = "def"; std::cout << "str1: " << str1.GetData() << ", Length: " << str1.Length() << std::endl; str1 = str2; std::cout << "str1: " << str1.GetData() << ", Length: " << str1.Length() << std::endl; // 字符串连接运算符测试 CSimpleString str4 = str2 + str3; std::cout << "str4: " << str4.GetData() << ", Length: " << str4.Length() << std::endl; // 字符串比较运算符测试 if(str2 == str3) { std::cout << "str2 == str3" << std::endl; } if(str2 != str3) { std::cout << "str2 != str3" << std::endl; } if(str2 < str3) { std::cout << "str2 < str3" << std::endl; } if(str2 > str3) { std::cout << "str2 > str3" << std::endl; } // 下标运算符测试 try { std::cout << "str1[0]: " << str1[0] << std::endl; std::cout << "str1[3]: " << str1[3] << std::endl; } catch(std::out_of_range& e) { std::cerr << "Exception: " << e.what() << std::endl; } return 0; } ``` 输出结果如下: ``` str1: str2: abc, Length: 3 str3: abc, Length: 3 str1: def, Length: 3 str1: abc, Length: 3 str4: abcabc, Length: 6 str2 == str3 str2 < str3 str1[0]: a Exception: Index out of range ```

相关推荐

最新推荐

recommend-type

C#实现char字符数组与字符串相互转换的方法

主要介绍了C#实现char字符数组与字符串相互转换的方法,结合实例形式简单分析了C#字符数组转字符串及字符串转字符数组的具体实现技巧,需要的朋友可以参考下
recommend-type

Java中char数组(字符数组)与字符串String类型的转换方法

主要介绍了Java中char数组(字符数组)与字符串String类型的转换方法,涉及Java中toCharArray与valueOf方法的使用技巧,需要的朋友可以参考下
recommend-type

C#字符串数组转换为整形数组的方法

主要介绍了C#字符串数组转换为整形数组的方法,涉及C#数组遍历与转换的相关技巧,需要的朋友可以参考下
recommend-type

VBScript把json字符串解析成json对象的2个方法

主要介绍了VBScript把json字符串解析成json对象的2个方法,本文通过MSScriptControl.ScriptControl和jscript实现,需要的朋友可以参考下
recommend-type

总结C#删除字符串数组中空字符串的几种方法

C#中要如何才能删除一个字符串数组中的空字符串呢?下面的文章会介绍多种方式来实现清除数组中的空字符串,以及在.net中将字符串数组中字符串为空的元素去除。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性

![MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性](https://picx.zhimg.com/80/v2-8132d9acfebe1c248865e24dc5445720_1440w.webp?source=1def8aca) # 1. MATLAB结构体基础** MATLAB结构体是一种数据结构,用于存储和组织相关数据。它由一系列域组成,每个域都有一个名称和一个值。结构体提供了对数据的灵活访问和管理,使其成为组织和处理复杂数据集的理想选择。 MATLAB中创建结构体非常简单,使用struct函数即可。例如: ```matlab myStruct
recommend-type

详细描述一下STM32F103C8T6怎么与DHT11连接

STM32F103C8T6可以通过单总线协议与DHT11连接。连接步骤如下: 1. 将DHT11的VCC引脚连接到STM32F103C8T6的5V电源引脚; 2. 将DHT11的GND引脚连接到STM32F103C8T6的GND引脚; 3. 将DHT11的DATA引脚连接到STM32F103C8T6的GPIO引脚,可以选择任一GPIO引脚,需要在程序中配置; 4. 在程序中初始化GPIO引脚,将其设为输出模式,并输出高电平,持续至少18ms,以激活DHT11; 5. 将GPIO引脚设为输入模式,等待DHT11响应,DHT11会先输出一个80us的低电平,然后输出一个80us的高电平,
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。