// // Created by lenfrex on 2022/4/4. // #include #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 = source.length < length ? 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 { // 这部分类似于前边==重载的前置判断 if (source.length != length || data == nullptr) { return false; } else { if (source.data == data) { return true; } } // 以上情况都不符合时才进行逐字比较 int compareLength = source.length < length ? source.length : length; for (int i = 0; i < compareLength; ++i) { if (data[i] < source.data[i]) { return true; } } return false; }