From 3ac0fd4479093a20e127fa3f2a88eca79203b12b Mon Sep 17 00:00:00 2001 From: lensferno Date: Sat, 9 Apr 2022 09:11:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E4=BC=98=E5=8C=96=EF=BC=9A=E5=87=8F?= =?UTF-8?q?=E5=B0=91=E5=86=85=E5=AD=98=E5=88=86=E9=85=8D=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- work20220407/string/String.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/work20220407/string/String.cpp b/work20220407/string/String.cpp index 6e4a58c..6170991 100644 --- a/work20220407/string/String.cpp +++ b/work20220407/string/String.cpp @@ -25,7 +25,7 @@ String::String() : String(128) {} String::String(const char *source) : String(source, (int) strlen(source)) {} /** - * 从源中复制字符串来构建新的对象,并定义初始长度,小于源字符串则会被截取 + * 从源中复制字符串来构建新的对象,并定义字符串实际长度,小于源字符串则会被截取 */ String::String(const char *source, int length) : String(length + 1) { strncpy(data, source, length); @@ -152,8 +152,6 @@ void String::addString(const char *source, int sourceLength) { this->data = new char[allocSize](); length = sourceLength; - } else { - length = (int) strlen(data); } // 如果拼接后字符长度超过已分配的内存大小,则重新分配data内存大小 @@ -162,17 +160,17 @@ void String::addString(const char *source, int sourceLength) { char *old = new char[length + 1](); strcpy(old, data); - // 重新分配内存,防止拼接后溢出 + // 分配两倍内存空间来减少重新分配次数 delete[] data; - allocSize = length + sourceLength + 1; + allocSize = (length + sourceLength)*2 + 1; this->data = new char[allocSize](); strcpy(data, old); } strcat(data, source); - length = allocSize - 1; + length += sourceLength; } /** @@ -217,14 +215,16 @@ char &String::operator[](int i) { String String::operator+(const char *source) { int sourceLength = (int) strlen(source); - String target(this->data, this->length + sourceLength + 1); + String target = String((this->length + sourceLength)*2 + 1); + target = this->data; target += source; return target; } String String::operator+(const String &source) { - String target(this->data, this->length + source.length); + String target = String((this->length + source.length)*2 + 1); + target = this->data; target += source; return target;