You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							125 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
	
	
							125 lines
						
					
					
						
							3.1 KiB
						
					
					
				| //
 | |
| // Created by lenfrex on 2022/4/4.
 | |
| //
 | |
| 
 | |
| #include <cstring>
 | |
| #include <algorithm>
 | |
| 
 | |
| #include "CString.h"
 | |
| 
 | |
| /*
 | |
|  * 按照给定大小来初始化字符串数据
 | |
|  */
 | |
| CString::CString(int length) {
 | |
|     data = new char[length]();
 | |
|     CString::length = length;
 | |
| }
 | |
| 
 | |
| CString::~CString() {
 | |
|     delete[] data;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * 不设定初始化大小就默认512个字符来初始化
 | |
|  */
 | |
| CString::CString() : CString(512) {}
 | |
| 
 | |
| /*
 | |
|  * 重载等号。借鉴了Java中String类的equal()方法的实现。
 | |
|  * 首先比较两字符串长度,如果长度不一样不用说,直接返回false;如果data为nullptr,不做比较并返回false
 | |
|  * 相同的话再比较两字符串数据指针指向地址是否一样,一样就代表指向的是同一块内存,直接返回true
 | |
|  * 两者都不同才进行逐字比较
 | |
|  */
 | |
| bool CString::operator==(const CString &source) const {
 | |
|     // 判断两CString长度以及本对象data成员是否为空指针
 | |
|     if (source.length != length || data == nullptr) {
 | |
|         return false;
 | |
|     } else {
 | |
|         // 判断两对象data成员是否指向同一内存块
 | |
|         if (source.data == data) {
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // 以上情况都不符合时才进行逐字比较
 | |
|     int compareLength = std::min(source.length, length);
 | |
|     for (int i = 0; i < compareLength; ++i) {
 | |
|         if (data[i] != source.data[i]) {
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * 从源中复制字符串来构建新的对象
 | |
|  */
 | |
| CString::CString(char *source) : CString((int)strlen(source)) {
 | |
|     strncpy(data, source, length);
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * 从源中复制字符串来构建新的对象,并定义初始长度,小于源字符串则会被截取
 | |
|  */
 | |
| CString::CString(char *source, int length) : CString(length) {
 | |
|     strncpy(data, source, length);
 | |
| }
 | |
| 
 | |
| CString &CString::operator=(const CString &source) {
 | |
|     // 处理自己给自己赋值的情况,那叫啥,自赋值
 | |
|     if (this == &source) {
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     if (data != nullptr && length != 0) {
 | |
|         delete[] data;
 | |
|     }
 | |
| 
 | |
|     this->length = source.length;
 | |
|     this->data = new char[length]();
 | |
| 
 | |
|     strncpy(data, source.data, length);
 | |
| 
 | |
|     return *this;
 | |
| }
 | |
| 
 | |
| CString &CString::operator+=(const CString &source) {
 | |
|     if (data == nullptr && length == 0) {
 | |
|         this->length = source.length;
 | |
|         this->data = new char[length]();
 | |
|     }
 | |
| 
 | |
|     char *tmp = new char[length]();
 | |
|     strncpy(tmp, data, length);
 | |
| 
 | |
|     // 重新分配内存,防止拼接后溢出
 | |
|     delete[] data;
 | |
|     this->length += source.length;
 | |
|     this->data = new char[this->length];
 | |
| 
 | |
|     strcpy(tmp, data);
 | |
|     strncat(data, source.data, source.length);
 | |
| 
 | |
|     return *this;
 | |
| }
 | |
| 
 | |
| CString::CString(const CString &source) : CString(source.data, source.length) {}
 | |
| 
 | |
| /*
 | |
|  * 按照字典顺序逐字对比
 | |
|  */
 | |
| bool CString::operator<(const CString &source) const {
 | |
|     // 这部分类似于前边==重载的前置判断,如果本对象数据为null或者两对象数据是一回事就直接false
 | |
|     if (data == nullptr || (source.length != length && source.data == data)) {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     // 以上情况都不符合时才进行逐字比较
 | |
|     int compareLength = std::min(source.length, length);
 | |
|     for (int i = 0; i < compareLength; ++i) {
 | |
|         if (data[i] < source.data[i]) {
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 |